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个月前关闭。





以相同顺序应用于相同系列条件时,||Stream.of(..).anyMatch(e-> e==true)在功能上是否等效?

任务:对一系列条件进行快速测试,以确定是否符合条件。

可能的解决方案:
-用“或”符号(||)分隔每个条件
-将每个条件包括在Stream.of(..)语句中,该语句附加.anyMatch(e-> e==true)

anyMatch(..)的文档指出:“返回此流的任何元素是否与提供的谓词匹配。如果不一定要确定结果[强调],则可能无法对所有元素都评估谓词。”

根据此陈述,我的理解是,上面指出的两个解决方案在功能上是相同的,因此,如果严重程度为4的第二个元素是true的第一个元素,则不会评估元素3和4 。

但是,实际上,这似乎是不正确的。考虑以下情况,其中itemnullemptytrue,并且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