Fix the implementation of Stream.anyMatch/allMatch/noneMatch to support streams with null elements.
Bug: 9477
Bug-Link: https://github.com/gwtproject/gwt/issues/9477
Change-Id: I46290f2cde8d3ee075547a5673b7e8c693782b15
diff --git a/user/super/com/google/gwt/emul/java/util/stream/StreamImpl.java b/user/super/com/google/gwt/emul/java/util/stream/StreamImpl.java
index bb5bc94..1126fc6 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/StreamImpl.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/StreamImpl.java
@@ -609,9 +609,11 @@
return findFirst();
}
+ private static final Consumer<Object> NULL_CONSUMER = value -> { };
+
@Override
public boolean anyMatch(Predicate<? super T> predicate) {
- return filter(predicate).findFirst().isPresent();
+ return filter(predicate).spliterator().tryAdvance(NULL_CONSUMER);
}
@Override
diff --git a/user/test/com/google/gwt/emultest/java8/util/stream/StreamTest.java b/user/test/com/google/gwt/emultest/java8/util/stream/StreamTest.java
index e8b405c..1e0b5a0 100644
--- a/user/test/com/google/gwt/emultest/java8/util/stream/StreamTest.java
+++ b/user/test/com/google/gwt/emultest/java8/util/stream/StreamTest.java
@@ -291,34 +291,52 @@
public void testAnyMatch() {
// all
assertTrue(Stream.of("a", "b").anyMatch(s -> true));
-
// some
assertTrue(Stream.of("a", "b").anyMatch(s -> s.equals("a")));
-
// none
assertFalse(Stream.of("a", "b").anyMatch(s -> false));
+
+ // With null values.
+ // all
+ assertTrue(Stream.of(null, "a", "b").anyMatch(s -> true));
+ // some
+ assertTrue(Stream.of(null, "a", "b").anyMatch(s -> s == null));
+ // none
+ assertFalse(Stream.of(null, "a", "b").anyMatch(s -> false));
}
public void testAllMatch() {
// all
assertTrue(Stream.of("a", "b").allMatch(s -> true));
-
// some
assertFalse(Stream.of("a", "b").allMatch(s -> s.equals("a")));
-
// none
assertFalse(Stream.of("a", "b").allMatch(s -> false));
+
+ // With null values.
+ // all
+ assertTrue(Stream.of(null, "a", "b").allMatch(s -> true));
+ // some
+ assertFalse(Stream.of(null, "a", "b").allMatch(s -> s != null));
+ // none
+ assertFalse(Stream.of(null, "a", "b").allMatch(s -> false));
}
public void testNoneMatch() {
// all
assertFalse(Stream.of("a", "b").noneMatch(s -> true));
-
// some
assertFalse(Stream.of("a", "b").noneMatch(s -> s.equals("a")));
-
// none
assertTrue(Stream.of("a", "b").noneMatch(s -> false));
+
+ // With null values.
+ // all
+ assertFalse(Stream.of(null, "a", "b").noneMatch(s -> true));
+ // some
+ assertFalse(Stream.of(null, "a", "b").noneMatch(s -> s == null));
+ // none
+ assertTrue(Stream.of(null, "a", "b").noneMatch(s -> false));
}
public void testFlatMap() {