考虑这个片段 -
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
都将为 false。在这种情况下,为什么它要尝试评估 b.substring(2)
?
This article和 this article声称如果不需要确定结果,它可能不会评估所有表达式。显然这里的情况并非如此。
Java 7 之前 -
if(b != null && b.substring(2) != null)
这不会抛出 NPE,因为 b!= null
是 false
并且它本身会返回 false
。
那么,我们是否可以说 Streams.allMatch
并不完全等同于上述 Java 代码片段?
最佳答案
这与 allMatch
无关,而与在任何情况下调用该方法之前都会评估该方法的所有参数这一事实有关。在这种特殊情况下,Stream.of
的所有参数都会在调用 Stream.of
之前进行评估。
如果你真的想要一些不同的东西,最接近你想要的行为的东西看起来像
Stream
.<Supplier<String>>of(() -> a, () -> b, () -> b.substring(2), () -> c)
.map(Supplier::get)
.allMatch(x -> x != null)
关于java - 为什么 Stream.allMatch(在 Java 8 中)尝试计算所有表达式,即使可以在中途确定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60641257/