diff --git a/src/main/java/org/springframework/hateoas/Links.java b/src/main/java/org/springframework/hateoas/Links.java index f8ec9164..83f2b59f 100644 --- a/src/main/java/org/springframework/hateoas/Links.java +++ b/src/main/java/org/springframework/hateoas/Links.java @@ -22,6 +22,7 @@ import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collector; @@ -133,6 +134,35 @@ public class Links implements Iterable { return and(Arrays.asList(links)); } + /** + * Adds the given links if the given condition is {@literal true}. The given {@link Supplier}s will only be resolved + * if the given condition is true. Essentially syntactic sugar to write:
+ * + * if (a > 3) { + * links = links.and(…); + * } + * as + * links = link.and(a > 3, …); + * + * + * @param condition + * @param links must not be {@literal null}. + * @return + */ + @SafeVarargs + public final Links and(boolean condition, Supplier... links) { + + Assert.notNull(links, "Links must not be null!"); + + if (!condition) { + return this; + } + + return and(Arrays.stream(links) // + .map(Supplier::get) // + .collect(Collectors.toList())); + } + /** * Creates a new {@link Links} instance with all given {@link Link}s added. For conditional adding see * {@link #merge(Iterable)}. diff --git a/src/test/java/org/springframework/hateoas/LinksUnitTest.java b/src/test/java/org/springframework/hateoas/LinksUnitTest.java index 11014fad..bdcc0885 100755 --- a/src/test/java/org/springframework/hateoas/LinksUnitTest.java +++ b/src/test/java/org/springframework/hateoas/LinksUnitTest.java @@ -135,4 +135,20 @@ class LinksUnitTest { assertThat(Links.of(first, second).containsSameLinksAs(Links.of(first))).isFalse(); assertThat(Links.of(first, second).containsSameLinksAs(Links.of(first, second))).isTrue(); } + + @Test // #1322 + void conditionallyAddsLink() { + + Links links = Links.NONE.and(true, () -> Link.of("/foo")); + + assertThat(links.getRequiredLink(IanaLinkRelations.SELF).getHref()).isEqualTo("/foo"); + } + + @Test // #1322 + void doesNotEvaluateSupplierIfAddConditionIsFalse() { + + assertThatCode(() -> Links.NONE.and(false, () -> { + throw new IllegalStateException(); + })).doesNotThrowAnyException(); + } }