From cd6e0084ef49a5feebd3852628166c2c7de5ef83 Mon Sep 17 00:00:00 2001 From: Robin Karlsson Date: Sun, 20 May 2018 21:45:36 +0200 Subject: [PATCH] Add Stream variants of each and with (#118) --- src/main/java/j2html/TagCreator.java | 14 +++++++++++++- src/main/java/j2html/tags/ContainerTag.java | 13 +++++++++++++ src/test/java/j2html/tags/TagCreatorTest.java | 10 ++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/j2html/TagCreator.java b/src/main/java/j2html/TagCreator.java index 4e20d0c..83afe0a 100644 --- a/src/main/java/j2html/TagCreator.java +++ b/src/main/java/j2html/TagCreator.java @@ -18,6 +18,7 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; public class TagCreator { @@ -83,6 +84,17 @@ public class TagCreator { return DomContentJoiner.join(" ", true, stringOrDomObjects); } + /** + * Creates a DomContent object containing HTML elements from a stream. + * Intended usage: {@literal each(numbers.stream().map(n -> li(n.toString())))} + * + * @param stream the stream of DomContent elements + * @return DomContent containing elements from the stream + */ + public static DomContent each(Stream stream) { + return new ContainerTag(null).with(stream); + } + /** * Creates a DomContent object containing HTML using a mapping function on a collection * Intended usage: {@literal each(numbers, n -> li(n.toString()))} @@ -93,7 +105,7 @@ public class TagCreator { * @return DomContent containing mapped data {@literal (ex. docs: [li(1), li(2), li(3)])} */ public static DomContent each(Collection collection, Function mapper) { - return tag(null).with(collection.stream().map(mapper).collect(Collectors.toList())); + return tag(null).with(collection.stream().map(mapper)); } public static DomContent each(final Map map, final Function, DomContent> mapper) { diff --git a/src/main/java/j2html/tags/ContainerTag.java b/src/main/java/j2html/tags/ContainerTag.java index dbd7a7a..ceb4050 100644 --- a/src/main/java/j2html/tags/ContainerTag.java +++ b/src/main/java/j2html/tags/ContainerTag.java @@ -4,6 +4,7 @@ import j2html.Config; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; public class ContainerTag extends Tag { @@ -89,6 +90,18 @@ public class ContainerTag extends Tag { } + /** + * Appends the DomContent-objects in the stream to the end of this element + * + * @param children Stream of DomContent-objects to be appended + * @return itself for easy chaining + */ + public ContainerTag with(Stream children) { + children.forEach(this::with); + return this; + } + + /** * Call with-method based on condition * {@link #with(DomContent... children)} diff --git a/src/test/java/j2html/tags/TagCreatorTest.java b/src/test/java/j2html/tags/TagCreatorTest.java index 8d5d2fe..a1a66c6 100644 --- a/src/test/java/j2html/tags/TagCreatorTest.java +++ b/src/test/java/j2html/tags/TagCreatorTest.java @@ -143,6 +143,16 @@ public class TagCreatorTest { assertThat(j2htmlFilter.equals(javaFilter), is(true)); } + @Test + public void testEachWithStream() throws Exception { + final String j2htmlMap = ul().with( + li("Begin list"), + each(employeeMap.entrySet().stream().map(e -> li(e.getKey() + "-" + e.getValue().name))) + ).render(); + + assertThat(j2htmlMap, is("
  • Begin list
  • 1-Name 1
  • 2-Name 2
  • 3-Name 3
")); + } + @Test public void testAllTags() throws Exception {