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();
+ }
}