This question already has answers here:
Why is Streams.allMatch(in Java8) trying to evaluate all the expressions even if the value can be determined midway?
(2个答案)
3个月前关闭。
以相同顺序应用于相同系列条件时,
任务:对一系列条件进行快速测试,以确定是否符合条件。
可能的解决方案:
-用“或”符号(
-将每个条件包括在
根据此陈述,我的理解是,上面指出的两个解决方案在功能上是相同的,因此,如果严重程度为4的第二个元素是
但是,实际上,这似乎是不正确的。考虑以下情况,其中
鉴于上面引用的
谢谢
因此,
(2个答案)
3个月前关闭。
以相同顺序应用于相同系列条件时,
||
和Stream.of(..).anyMatch(e-> e==true)
在功能上是否等效?任务:对一系列条件进行快速测试,以确定是否符合条件。
可能的解决方案:
-用“或”符号(
||
)分隔每个条件-将每个条件包括在
Stream.of(..)
语句中,该语句附加.anyMatch(e-> e==true)
anyMatch(..)
的文档指出:“返回此流的任何元素是否与提供的谓词匹配。如果不一定要确定结果[强调],则可能无法对所有元素都评估谓词。”根据此陈述,我的理解是,上面指出的两个解决方案在功能上是相同的,因此,如果严重程度为4的第二个元素是
true
的第一个元素,则不会评估元素3和4 。但是,实际上,这似乎是不正确的。考虑以下情况,其中
item
是null
,empty
是true
,并且UtilMethods.isEmpty(..)
是用于测试给定参数是null
还是空的String
(“”)的自定义库方法:@Override
protected void updateItem(Pair<K, V> item, boolean empty) {
super.updateItem(item, empty);
boolean test1 = empty
|| Objects.isNull(item)
|| UtilMethods.isEmpty(item.toString())
|| Objects.isNull(item.getValue());
boolean test2 = Stream.of(
empty,
isNull(item),
UtilMethods.isEmpty(item.toString()),
isNull(item.getValue()))
.anyMatch(e -> e == true);
}
||
代码按预期运行。但是,由于Stream.of(..).anyMatch(..)
是NullPointerException
,当到达第三个元素时,item
会引发null
。鉴于上面引用的
anyMatch(..)
文档没有意义,这表明甚至不应该达到第三个元素。还是我在这里想念什么?谢谢
最佳答案
UtilMethods.isEmpty(item.toString())
是在执行Stream.of()
之前求值的,因此无论之后是否调用NullPointerException
,它都会抛出anyMatch
。
就像任何方法调用一样,Stream.of()
在执行之前先评估其所有参数,因此它必须对UtilMethods.isEmpty(item.toString())
进行评估。
您可以在更简单的代码段中看到相同的行为:
String s = null;
Stream<Integer> stream = Stream.of (5,s.length());
因此,
anyMatch
的文档与您观察到的行为无关。10-01 05:16