From 83dd32b901dea25a571adcd6a976464c8a36601c Mon Sep 17 00:00:00 2001 From: "U-EUR\\jwi" Date: Fri, 14 Feb 2020 22:25:06 +0100 Subject: [PATCH] Adding Streams.toArray --- .../org/apache/commons/lang3/Streams.java | 61 +++++++++++++++++++ .../org/apache/commons/lang3/StreamsTest.java | 11 ++++ 2 files changed, 72 insertions(+) diff --git a/src/main/java/org/apache/commons/lang3/Streams.java b/src/main/java/org/apache/commons/lang3/Streams.java index c097d76f3..86edb2f42 100644 --- a/src/main/java/org/apache/commons/lang3/Streams.java +++ b/src/main/java/org/apache/commons/lang3/Streams.java @@ -16,7 +16,12 @@ */ package org.apache.commons.lang3; +import java.lang.reflect.Array; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Consumer; @@ -420,4 +425,60 @@ public class Streams { public static FailableStream stream(Collection pStream) { return stream(pStream.stream()); } + + public static class ArrayCollector implements Collector, O[]> { + private static final Set characteristics = Collections.emptySet(); + private final Class elementType; + + public ArrayCollector(Class pElementType) { + elementType = pElementType; + } + + @Override + public Supplier> supplier() { + return () -> new ArrayList(); + } + + @Override + public BiConsumer, O> accumulator() { + return (list, o) -> { + list.add(o); + }; + } + + @Override + public BinaryOperator> combiner() { + return (left, right) -> { + left.addAll(right); + return left; + }; + } + + @Override + public Function, O[]> finisher() { + return (list) -> { + @SuppressWarnings("unchecked") + final O[] array = (O[]) Array.newInstance(elementType, list.size()); + return list.toArray(array); + }; + } + + @Override + public Set characteristics() { + return characteristics; + } + } + + /** + * Returns a {@code Collector} that accumulates the input elements into a + * new array. + * + * @param pElementType Type of an element in the array. + * @param the type of the input elements + * @return a {@code Collector} which collects all the input elements into an + * array, in encounter order + */ + public static Collector toArray(Class pElementType) { + return new ArrayCollector(pElementType); + } } diff --git a/src/test/java/org/apache/commons/lang3/StreamsTest.java b/src/test/java/org/apache/commons/lang3/StreamsTest.java index 3ce713d93..da98397d3 100644 --- a/src/test/java/org/apache/commons/lang3/StreamsTest.java +++ b/src/test/java/org/apache/commons/lang3/StreamsTest.java @@ -17,6 +17,7 @@ package org.apache.commons.lang3; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.fail; @@ -64,6 +65,16 @@ class StreamsTest { } } + @Test + void testToArray() { + final String[] array = Arrays.asList("2", "3", "1").stream().collect(Streams.toArray(String.class)); + assertNotNull(array); + assertEquals(3, array.length); + assertEquals("2", array[0]); + assertEquals("3", array[1]); + assertEquals("1", array[2]); + } + protected FailableConsumer asIntConsumer(T pThrowable) { return (s) -> { final Integer i = Integer.valueOf(s);