diff --git a/src/main/java/tools/jackson/databind/util/JacksonCollectors.java b/src/main/java/tools/jackson/databind/util/JacksonCollectors.java new file mode 100644 index 0000000000..efe70ef1df --- /dev/null +++ b/src/main/java/tools/jackson/databind/util/JacksonCollectors.java @@ -0,0 +1,38 @@ +package tools.jackson.databind.util; + +import java.util.stream.Collector; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeCreator; +import tools.jackson.databind.node.JsonNodeFactory; + +/** + * Utility class that provides custom {@link Collector} implementations to support Stream operations. + *

+ * This class is not meant to be instantiated and serves only as a utility class. + *

+ * + * @since 2.18 + */ +public abstract class JacksonCollectors { + /** + * Creates a {@link Collector} that collects {@link JsonNode} elements into an {@link ArrayNode}. + *

+ * This method uses a {@link JsonNodeFactory} to create an empty {@link ArrayNode} and then adds each + * {@link JsonNode} to it. + *

+ * + * @return a {@link Collector} that collects {@link JsonNode} elements into an {@link ArrayNode} + */ + public static Collector toJsonNode() { + return toJsonNode(JsonNodeFactory.instance); + } + + public static Collector toJsonNode(JsonNodeCreator nodeCreator) { + return Collector.of( + nodeCreator::arrayNode, // supplier + ArrayNode::add, // accumulator + ArrayNode::addAll // combiner + ); + } +} diff --git a/src/test/java/tools/jackson/databind/util/JacksonCollectorsTest.java b/src/test/java/tools/jackson/databind/util/JacksonCollectorsTest.java new file mode 100644 index 0000000000..cedc044060 --- /dev/null +++ b/src/test/java/tools/jackson/databind/util/JacksonCollectorsTest.java @@ -0,0 +1,33 @@ +package tools.jackson.databind.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.util.stream.IntStream; +import org.junit.jupiter.api.Test; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; + +public class JacksonCollectorsTest { + + @Test + public void testToJsonNode() + { + final ObjectMapper objectMapper = new ObjectMapper(); + + final JsonNode jsonNodeResult = IntStream.range(0, 10) + .mapToObj(i -> { + ObjectNode objectNode = objectMapper.createObjectNode(); + objectNode.put("testString", "example"); + objectNode.put("testNumber", i); + objectNode.put("testBoolean", true); + + return objectNode; + }) + .collect(JacksonCollectors.toJsonNode()); + + assertEquals(10, jsonNodeResult.size()); + jsonNodeResult.forEach(jsonNode -> assertFalse(jsonNode.isEmpty())); + } +}