Java Predicate的原理

3
我发现了这个代码片段:
List<String> colors = Arrays.asList("red", "green", "yellow");
Predicate<String> test = n ->
{
    System.out.println("Searching…");
    return n.contains("red");
};
colors.stream().filter(c -> c.length() > 3).allMatch(test);

输出结果显示了。
Searching...

当我移除.filter(c -> c.length() > 3)时,它会显示

Searching...
Searching...

在做一些其他测试后,我发现最后一个元素(黄色)从未被测试过!

为什么会这样呢?

能否有人友好地解释一下背后的机制吗?

非常感谢!

1个回答

4
你调用了allMatch。它只是想知道“每个项目是否都与此断言匹配?” 它将遍历流并为每个项目评估谓词,直到找到一个错误的项目,因为一旦找到一个错误的项目,它就可以确定不是每个项目都与谓词匹配。
文档说:

如果不必要确定结果,则可能不会对所有元素评估谓词。

一旦找到谓词为false的项目,就不再评估任何其他项目。

1
此外,.filter(c -> c.length() > 3) 在所分享的示例中匹配元素的计数中起着作用。当它存在时,它会排除 "red" 的匹配,因此只有 Searching...,而当 filter 被移除时,就会出现两个 Searching... Searching... - Naman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接