Рассмотрим этот фрагмент -
String a = "hello" , b = null, c = "guru";
boolean value = Stream
.of(a, b, b.substring(2),c)
.allMatch(x -> x != null);
System.out.println(value);
Это приводит к NPE. Кажется, он делает b.substring(2)
, а поскольку b
равно null
, NPE выбрасывается. Почему это состояние оценивается? Второе выражение b
равно null
и, следовательно, имеет значение false
. Таким образом, allMatch
будет ложным независимо от значений истинности последующих операций. В таком случае, почему он пытается оценить b.substring(2)
?
В этой статье и в этой статье утверждается, что он может не оценивать все выражения, если в этом нет необходимости для определения результата. Это явно не похоже на случай.
До Java 7 -
if(b != null && b.substring(2) != null)
это не будет бросать NPE, потому что b!= null
is false
и он вернется false
там сам. Итак, можем ли мы сказать, что Streams.allMatch
не является точным эквивалентом приведенного выше Java фрагмента кода?