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() {