Add LangCollectors.collect(Collector, T...)

This commit is contained in:
Gary Gregory 2024-07-25 08:26:41 -04:00
parent ce19ec720b
commit 118652d768
3 changed files with 142 additions and 0 deletions

View File

@ -56,6 +56,7 @@ The <action> type attribute can be add,update,fix,remove.
<action type="add" dev="ggregory" due-to="Gary Gregory">Add StopWatch.getStopInstant() and deprecate getStopTime().</action>
<action type="add" dev="ggregory" due-to="Gary Gregory">Add StopWatch.getDuration() and deprecate getTime().</action>
<action type="add" dev="ggregory" due-to="Oliver B. Fischer, Gary Gregory">Add Javadoc links from StopWatch to DurationUtils #1249.</action>
<action type="add" dev="ggregory" due-to="Gary Gregory">Add LangCollectors.collect(Collector, T...).</action>
<!-- UPDATE -->
</release>
<release version="3.15.0" date="2024-07-13" description="New features and bug fixes (Java 8 or above).">

View File

@ -17,6 +17,7 @@
package org.apache.commons.lang3.stream;
import java.util.Arrays;
import java.util.Collections;
import java.util.Objects;
import java.util.Set;
@ -27,6 +28,7 @@ import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
@ -91,6 +93,24 @@ public final class LangCollectors {
private static final Set<Collector.Characteristics> CH_NOID = Collections.emptySet();
/**
* Delegates to {@link Stream#collect(Collector)} for a Stream on the given array.
*
* @param <T> The type of the array elements.
* @param <R> the type of the result.
* @param <A> the intermediate accumulation type of the {@code Collector}.
* @param collector the {@code Collector} describing the reduction.
* @param array The array, assumed to be unmodified during use.
* @return the result of the reduction
* @see Stream#collect(Collector)
* @see Arrays#stream(Object[])
* @see Collectors
* @since 3.16.0
*/
public static <T, R, A> R collect(final Collector<? super T, A, R> collector, final T... array) {
return Arrays.stream(array).collect(collector);
}
/**
* Returns a {@code Collector} that concatenates the input elements, separated by the specified delimiter, in encounter order.
* <p>

View File

@ -19,6 +19,7 @@ package org.apache.commons.lang3.stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Arrays;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
@ -57,8 +58,111 @@ public class LangCollectorsTest {
private static final Collector<Object, ?, String> JOINING_4 = LangCollectors.joining("-", "<", ">", TO_STRING);
private static final Collector<Object, ?, String> JOINING_4_NUL = LangCollectors.joining("-", "<", ">", o -> Objects.toString(o, "NUL"));
private String join0(final Object... objects) {
return LangCollectors.collect(JOINING_0, objects);
}
private String join1(final Object... objects) {
return LangCollectors.collect(JOINING_1, objects);
}
private String join3(final Object... objects) {
return LangCollectors.collect(JOINING_3, objects);
}
private String join4(final Object... objects) {
return LangCollectors.collect(JOINING_4, objects);
}
private String join4Nul(final Object... objects) {
return LangCollectors.collect(JOINING_4_NUL, objects);
}
@Test
public void testCollectStrings1Arg() {
assertEquals("", join1());
assertEquals("1", join1("1"));
assertEquals("1-2", join1("1", "2"));
assertEquals("1-2-3", join1("1", "2", "3"));
assertEquals("1-null-3", join1("1", null, "3"));
}
@Test
public void testJoinCollectNonStrings0Arg() {
assertEquals("", join0());
assertEquals("1", join0(_1L));
assertEquals("12", join0(_1L, _2L));
assertEquals("123", join0(_1L, _2L, _3L));
assertEquals("1null3", join0(_1L, null, _3L));
assertEquals("12", join0(new AtomicLong(1), new AtomicLong(2)));
assertEquals("12", join0(new Fixture(1), new Fixture(2)));
}
@Test
public void testJoinCollectNonStrings1Arg() {
assertEquals("", join1());
assertEquals("1", join1(_1L));
assertEquals("1-2", join1(_1L, _2L));
assertEquals("1-2-3", join1(_1L, _2L, _3L));
assertEquals("1-null-3", join1(_1L, null, _3L));
assertEquals("1-2", join1(new AtomicLong(1), new AtomicLong(2)));
assertEquals("1-2", join1(new Fixture(1), new Fixture(2)));
}
@Test
public void testJoinCollectNonStrings3Args() {
assertEquals("<>", join3());
assertEquals("<1>", join3(_1L));
assertEquals("<1-2>", join3(_1L, _2L));
assertEquals("<1-2-3>", join3(_1L, _2L, _3L));
assertEquals("<1-null-3>", join3(_1L, null, _3L));
assertEquals("<1-2>", join3(new AtomicLong(1), new AtomicLong(2)));
assertEquals("<1-2>", join3(new Fixture(1), new Fixture(2)));
}
@Test
public void testJoinCollectNonStrings4Args() {
assertEquals("<>", join4());
assertEquals("<1>", join4(_1L));
assertEquals("<1-2>", join4(_1L, _2L));
assertEquals("<1-2-3>", join4(_1L, _2L, _3L));
assertEquals("<1-null-3>", join4(_1L, null, _3L));
assertEquals("<1-NUL-3>", join4Nul(_1L, null, _3L));
assertEquals("<1-2>", join4(new AtomicLong(1), new AtomicLong(2)));
assertEquals("<1-2>", join4(new Fixture(1), new Fixture(2)));
}
@Test
public void testJoinCollectStrings0Arg() {
assertEquals("", join0());
assertEquals("1", join0("1"));
assertEquals("12", join0("1", "2"));
assertEquals("123", join0("1", "2", "3"));
assertEquals("1null3", join0("1", null, "3"));
}
@Test
public void testJoinCollectStrings3Args() {
assertEquals("<>", join3());
assertEquals("<1>", join3("1"));
assertEquals("<1-2>", join3("1", "2"));
assertEquals("<1-2-3>", join3("1", "2", "3"));
assertEquals("<1-null-3>", join3("1", null, "3"));
}
@Test
public void testJoinCollectStrings4Args() {
assertEquals("<>", join4());
assertEquals("<1>", join4("1"));
assertEquals("<1-2>", join4("1", "2"));
assertEquals("<1-2-3>", join4("1", "2", "3"));
assertEquals("<1-null-3>", join4("1", null, "3"));
assertEquals("<1-NUL-3>", join4Nul("1", null, "3"));
}
@Test
public void testJoiningNonStrings0Arg() {
// Stream.of()
assertEquals("", Stream.of().collect(JOINING_0));
assertEquals("1", Stream.of(_1L).collect(JOINING_0));
assertEquals("12", Stream.of(_1L, _2L).collect(JOINING_0));
@ -66,10 +170,19 @@ public class LangCollectorsTest {
assertEquals("1null3", Stream.of(_1L, null, _3L).collect(JOINING_0));
assertEquals("12", Stream.of(new AtomicLong(1), new AtomicLong(2)).collect(JOINING_0));
assertEquals("12", Stream.of(new Fixture(1), new Fixture(2)).collect(JOINING_0));
// Arrays.stream()
assertEquals("", Arrays.stream(new Object[] {}).collect(JOINING_0));
assertEquals("1", Arrays.stream(new Long[] { _1L }).collect(JOINING_0));
assertEquals("12", Arrays.stream(new Long[] { _1L, _2L }).collect(JOINING_0));
assertEquals("123", Arrays.stream(new Long[] { _1L, _2L, _3L }).collect(JOINING_0));
assertEquals("1null3", Arrays.stream(new Long[] { _1L, null, _3L }).collect(JOINING_0));
assertEquals("12", Arrays.stream(new AtomicLong[] { new AtomicLong(1), new AtomicLong(2) }).collect(JOINING_0));
assertEquals("12", Arrays.stream(new Fixture[] { new Fixture(1), new Fixture(2) }).collect(JOINING_0));
}
@Test
public void testJoiningNonStrings1Arg() {
// Stream.of()
assertEquals("", Stream.of().collect(JOINING_1));
assertEquals("1", Stream.of(_1L).collect(JOINING_1));
assertEquals("1-2", Stream.of(_1L, _2L).collect(JOINING_1));
@ -77,6 +190,14 @@ public class LangCollectorsTest {
assertEquals("1-null-3", Stream.of(_1L, null, _3L).collect(JOINING_1));
assertEquals("1-2", Stream.of(new AtomicLong(1), new AtomicLong(2)).collect(JOINING_1));
assertEquals("1-2", Stream.of(new Fixture(1), new Fixture(2)).collect(JOINING_1));
// Arrays.stream()
assertEquals("", Arrays.stream(new Object[] {}).collect(JOINING_1));
assertEquals("1", Arrays.stream(new Long[] { _1L }).collect(JOINING_1));
assertEquals("1-2", Arrays.stream(new Long[] { _1L, _2L }).collect(JOINING_1));
assertEquals("1-2-3", Arrays.stream(new Long[] { _1L, _2L, _3L }).collect(JOINING_1));
assertEquals("1-null-3", Arrays.stream(new Long[] { _1L, null, _3L }).collect(JOINING_1));
assertEquals("1-2", Arrays.stream(new AtomicLong[] { new AtomicLong(1), new AtomicLong(2) }).collect(JOINING_1));
assertEquals("1-2", Arrays.stream(new Fixture[] { new Fixture(1), new Fixture(2) }).collect(JOINING_1));
}
@Test