Java 谓词背后的机制

The mechanic behind Java Predicates

我遇到了这个代码片段:

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...

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

为什么会这样!?

有人可以解释一下它背后的机制吗?

非常感谢!!!

您给 allMatch 打了电话。这就是想知道"does every item match this predicate?"。这将遍历流并评估每个项目的谓词,直到找到一个错误的谓词,因为一旦找到它,它就可以肯定地说并非每个项目都与谓词匹配。

文档说

May not evaluate the predicate on all elements if not necessary for determining the result.

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