You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/11/18 17:46:39 UTC
[commons-lang] 03/03: Add Streams.nullSafeStream(Collection). Add Streams.toStream(Collection).
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
commit ff415c8f8f213d40a19f8dc9ac037050ef497bf8
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Nov 18 12:46:31 2021 -0500
Add Streams.nullSafeStream(Collection).
Add Streams.toStream(Collection).
---
src/changes/changes.xml | 2 +
.../org/apache/commons/lang3/stream/Streams.java | 31 +++++++++++--
.../apache/commons/lang3/stream/StreamsTest.java | 51 ++++++++++++++--------
3 files changed, 63 insertions(+), 21 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 852c3dc..01d241c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -97,6 +97,8 @@ The <action> type attribute can be add,update,fix,remove.
<action type="add" dev="ggregory" due-to="Gary Gregory">Add and use ClassUtils.isPublic(Class).</action>
<action type="add" dev="ggregory" due-to="Gary Gregory">Add UncheckedIllegalAccessException.</action>
<action type="add" dev="ggregory" due-to="Gary Gregory">Add MethodInvokers.</action>
+ <action type="add" dev="ggregory" due-to="Gary Gregory">Add Streams.nullSafeStream(Collection).</action>
+ <action type="add" dev="ggregory" due-to="Gary Gregory">Add Streams.toStream(Collection).</action>
<!-- UPDATE -->
<action type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">Bump spotbugs-maven-plugin from 4.2.0 to 4.4.2.2 #735, #808, #822.</action>
<action type="update" dev="ggregory" due-to="Dependabot, XenoAmess">Bump Bump actions/cache from v2.1.4 to v2.1.6 #742, #752, #764.</action>
diff --git a/src/main/java/org/apache/commons/lang3/stream/Streams.java b/src/main/java/org/apache/commons/lang3/stream/Streams.java
index cd112e7..7cee571 100644
--- a/src/main/java/org/apache/commons/lang3/stream/Streams.java
+++ b/src/main/java/org/apache/commons/lang3/stream/Streams.java
@@ -446,8 +446,20 @@ public class Streams {
}
}
- private static <O> Stream<O> nullSafeStream(final Collection<O> collection) {
- return collection == null ? Stream.empty() : collection.stream();
+ private static <E> Stream<E> filter(final Collection<E> collection, final Predicate<? super E> predicate) {
+ return toStream(collection).filter(predicate);
+ }
+
+ /**
+ * Streams non-null elements of a collection.
+ *
+ * @param <E> the type of elements in the collection.
+ * @param collection the collection to stream or null.
+ * @return A non-null stream that filters out null elements.
+ * @since 3.13.0
+ */
+ public static <E> Stream<E> nullSafeStream(final Collection<E> collection) {
+ return filter(collection, Objects::nonNull);
}
/**
@@ -498,9 +510,10 @@ public class Streams {
* @param <O> The streams element type.
* @param stream The stream, which is being converted.
* @return The {@link FailableStream}, which has been created by converting the stream.
+ * TODO Rename to failableStream()
*/
public static <O> FailableStream<O> stream(final Collection<O> stream) {
- return stream(nullSafeStream(stream));
+ return stream(toStream(stream));
}
/**
@@ -553,4 +566,16 @@ public class Streams {
public static <O extends Object> Collector<O, ?, O[]> toArray(final Class<O> pElementType) {
return new ArrayCollector<>(pElementType);
}
+
+ /**
+ * Delegates to {@link Collection#stream()} or returns {@link Stream#empty()} if the collection is null.
+ *
+ * @param <E> the type of elements in the collection.
+ * @param collection the collection to stream or null.
+ * @return {@link Collection#stream()} or {@link Stream#empty()} if the collection is null.
+ * @since 3.13.0
+ */
+ public static <E> Stream<E> toStream(final Collection<E> collection) {
+ return collection == null ? Stream.empty() : collection.stream();
+ }
}
diff --git a/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java b/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java
index 79eeeb8..490799d 100644
--- a/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java
+++ b/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java
@@ -75,36 +75,30 @@ public class StreamsTest {
@TestFactory
public Stream<DynamicTest> simpleStreamFilterFailing() {
final List<String> input = Arrays.asList("1", "2", "3", "4", "5", "6");
- final List<Integer> output = Failable.stream(input).map(Integer::valueOf).filter(asIntPredicate(null))
- .collect(Collectors.toList());
+ final List<Integer> output = Failable.stream(input).map(Integer::valueOf).filter(asIntPredicate(null)).collect(Collectors.toList());
assertEvenNumbers(output);
return Stream.of(
dynamicTest("IllegalArgumentException", () -> {
final IllegalArgumentException iae = new IllegalArgumentException("Invalid argument: " + 5);
- final Executable testMethod = () -> Failable.stream(input).map(Integer::valueOf)
- .filter(asIntPredicate(iae)).collect(Collectors.toList());
+ final Executable testMethod = () -> Failable.stream(input).map(Integer::valueOf).filter(asIntPredicate(iae)).collect(Collectors.toList());
final IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, testMethod);
assertThat(thrown.getMessage(), is(equalTo("Invalid argument: " + 5)));
}),
dynamicTest("OutOfMemoryError", () -> {
final OutOfMemoryError oome = new OutOfMemoryError();
- final Executable testMethod = () -> Failable.stream(input).map(Integer::valueOf)
- .filter(asIntPredicate(oome)).collect(Collectors.toList());
+ final Executable testMethod = () -> Failable.stream(input).map(Integer::valueOf).filter(asIntPredicate(oome)).collect(Collectors.toList());
final OutOfMemoryError thrown = assertThrows(OutOfMemoryError.class, testMethod);
assertThat(thrown.getMessage(), is(nullValue()));
}),
dynamicTest("SAXException", () -> {
final SAXException se = new SAXException();
- final Executable testMethod = () -> Failable.stream(input).map(Integer::valueOf)
- .filter(asIntPredicate(se)).collect(Collectors.toList());
- final UndeclaredThrowableException thrown = assertThrows(UndeclaredThrowableException.class,
- testMethod);
- assertAll(() -> assertThat(thrown.getMessage(), is(nullValue())),
- () -> assertThat(thrown.getCause(), is(equalTo(se))));
+ final Executable testMethod = () -> Failable.stream(input).map(Integer::valueOf).filter(asIntPredicate(se)).collect(Collectors.toList());
+ final UndeclaredThrowableException thrown = assertThrows(UndeclaredThrowableException.class, testMethod);
+ assertAll(() -> assertThat(thrown.getMessage(), is(nullValue())), () -> assertThat(thrown.getCause(), is(equalTo(se))));
}));
}
@@ -131,14 +125,25 @@ public class StreamsTest {
dynamicTest("SAXException", () -> {
final SAXException se = new SAXException();
final Executable seTestMethod = () -> Failable.stream(input).forEach(asIntConsumer(se));
- final UndeclaredThrowableException seThrown = assertThrows(UndeclaredThrowableException.class,
- seTestMethod);
- assertAll(() -> assertThat(seThrown.getMessage(), is(nullValue())),
- () -> assertThat(seThrown.getCause(), is(equalTo(se))));
+ final UndeclaredThrowableException seThrown = assertThrows(UndeclaredThrowableException.class, seTestMethod);
+ assertAll(() -> assertThat(seThrown.getMessage(), is(nullValue())), () -> assertThat(seThrown.getCause(), is(equalTo(se))));
}));
}
@Test
+ public void testNullSafeStreamNotNull() {
+ assertEquals(2, Streams.nullSafeStream(Arrays.asList("A", "B")).collect(Collectors.toList()).size());
+ assertEquals(2, Streams.nullSafeStream(Arrays.asList(null, "A", null, "B", null)).collect(Collectors.toList()).size());
+ assertEquals(0, Streams.nullSafeStream(Arrays.asList(null, null)).collect(Collectors.toList()).size());
+ }
+
+ @Test
+ public void testNullSafeStreamNull() {
+ final List<String> input = null;
+ assertEquals(0, Streams.nullSafeStream(input).collect(Collectors.toList()).size());
+ }
+
+ @Test
public void testOfArray() {
assertEquals(0, Streams.of((Object[]) null).count());
assertEquals(1, Streams.of("foo").count());
@@ -148,8 +153,7 @@ public class StreamsTest {
@Test
public void testSimpleStreamFilter() {
final List<String> input = Arrays.asList("1", "2", "3", "4", "5", "6");
- final List<Integer> output = Failable.stream(input).map(Integer::valueOf).filter(i -> (i.intValue() % 2 == 0))
- .collect(Collectors.toList());
+ final List<Integer> output = Failable.stream(input).map(Integer::valueOf).filter(i -> (i.intValue() % 2 == 0)).collect(Collectors.toList());
assertEvenNumbers(output);
}
@@ -204,4 +208,15 @@ public class StreamsTest {
assertEquals("1", array[2]);
}
+ @Test
+ public void testToStreamNotNull() {
+ assertEquals(2, Streams.toStream(Arrays.asList("A", "B")).collect(Collectors.toList()).size());
+ }
+
+ @Test
+ public void testToStreamNull() {
+ final List<String> input = null;
+ assertEquals(0, Streams.toStream(input).collect(Collectors.toList()).size());
+ }
+
}