首页 > 解决方案 > Java 谓词背后的机制

问题描述

我遇到了这个代码片段:

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

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

这是为什么!?

有人可以这么好心并解释它背后的机制吗!?

非常感激!!!

标签: javajava-streampredicate

解决方案


你打电话allMatch。这只是想知道“每个项目都匹配这个谓词吗?”。这将遍历流并评估每个项目的谓词,直到找到一个为假的,因为一旦找到它,它就可以肯定地说并非每个项目都与谓词匹配。

文档说

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

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


推荐阅读