diff --git a/mug/src/main/java/com/google/mu/util/stream/MoreStreams.java b/mug/src/main/java/com/google/mu/util/stream/MoreStreams.java index e39ddddfcf..8858d08d9a 100644 --- a/mug/src/main/java/com/google/mu/util/stream/MoreStreams.java +++ b/mug/src/main/java/com/google/mu/util/stream/MoreStreams.java @@ -475,6 +475,28 @@ public static Stream whileNotNull(Supplier supplier) { false); } + /** + * Returns a Stream wrapping {@code element} if it's not null; otherwise empty. + * + *

Useful if you'll chain it with further {@code flatMap()}, {@code anyMatch()} etc. For + * example: + * + *

{@code
+   * boolean hasKeyword =
+   *     MoreStreams.ifNotNull(type.getAnnotation(MyAnnotation.class))
+   *         .flatMap(annotation -> annotation.keywords().stream())
+   *         .anyMatch(currentKeyword::equals);
+   * }
+ * + *

It's the Stream counterpart of {@link java.util.Optional#ofNullable}, and is more concise + * and efficient than {@code Optional.ofNullable(element).stream()}. + * + * @since 8.1 + */ + public static Stream ifNotNull(T element) { + return element == null ? Stream.empty() : Stream.of(element); + } + /** * Returns a sequential stream with {@code sideEfect} attached on every element. * diff --git a/mug/src/test/java/com/google/mu/util/stream/MoreStreamsTest.java b/mug/src/test/java/com/google/mu/util/stream/MoreStreamsTest.java index 7560ff9048..a38d64263f 100644 --- a/mug/src/test/java/com/google/mu/util/stream/MoreStreamsTest.java +++ b/mug/src/test/java/com/google/mu/util/stream/MoreStreamsTest.java @@ -346,7 +346,7 @@ public class MoreStreamsTest { @Test public void testNulls() throws Exception { NullPointerTester tester = new NullPointerTester(); asList(MoreStreams.class.getDeclaredMethods()).stream() - .filter(m -> m.getName().equals("generate")) + .filter(m -> m.getName().equals("generate") || m.getName().equals("ifNotNull")) .forEach(tester::ignore); tester.testAllPublicStaticMethods(MoreStreams.class); } @@ -387,4 +387,14 @@ public class MoreStreamsTest { .containsExactly(10, 2L, 9, 3L, 8, 1L) .inOrder(); } + + @Test public void testIfNotNull_fromNull() { + Object element = null; + assertThat(MoreStreams.ifNotNull(element)).isEmpty(); + } + + @Test public void testIfNotNull_fromNonNull() { + Object element = 1; + assertThat(MoreStreams.ifNotNull(element)).containsExactly(1); + } }