java - 为什么 Stream.allMatch(在 Java 8 中)尝试计算所有表达式,即使可以在中途确定值?

标签 java java-8 java-stream

考虑这个片段 -

 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) ,并且由于 bnull,因此会抛出 NPE。 为什么要评估这个条件?第二个表达式 bnull,因此计算结果为 false。 因此,无论后续操作的真值如何,allMatch 都将为 false。在这种情况下,为什么它要尝试评估 b.substring(2)

This articlethis article声称如果不需要确定结果,它可能不会评估所有表达式。显然这里的情况并非如此。


Java 7 之前 -

if(b != null && b.substring(2) != null)

这不会抛出 NPE,因为 b!= nullfalse 并且它本身会返回 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/

相关文章:

java - 相机预览不起作用 : Error while loading camera

java - 将一个char数组转换成多个String

java - Optional.flatMap() 和 Stream.flatMap() 之间有什么区别

java - 你将如何在 java8 中将方法转换为单行

java - 将多个流优化为单个循环

java - Coldfusion.security.NTAuthentication : Error in locating groups for user XXX in domain XXX

java - 如何为swing中的按钮创建点击事件?

Java 搜索包含双字母的单词

java - 该表达式的目标类型应该是函数接口(interface)

Java Stream GroupingBy 在自定义对象中收集