java - Java 8:Stream.filter 未按预期运行
问题描述
鉴于:
List<String> str = Arrays.asList ("my", "pen", "is", "your", "pen");
Predicate<String> test = s -> {
int i = 0;
boolean result = s.contains ("pen");
System.out.print((i++) + ":");
return result;
};
这打印:0:0:
str.stream().filter(test).findFirst();
这将打印 0:0:0:0:0:
str.stream().filter(test).collect(Collectors.toList());
让我困惑的是,无论是findFirst还是collect,无论终端操作是否短路,它们都应该遍历列表中的每个项目,对吗?
那么为什么在第一个示例 findFirst 中“0:”打印了两次,而不是一次,而不是5 次?
解决方案
让我困惑的是,无论是 findFirst 还是 collect,无论终端操作是否短路,它们都应该遍历列表中的每个项目,对吗?
在不检查整个流的情况下返回的能力正是使操作(如findFirst
)短路的原因。请参阅流 javadoc。
Streams 文档实际上并没有承诺如何或是否评估您的谓词。它只是保证它将返回与谓词匹配的流的第一个元素。
推荐阅读
- javascript - 如何检查 JSON 中的唯一值
- azure - 使用 Ansible AWX playbook 在 Azure Kubernetes 中运行的 ubuntu pod 中安装任何应用程序
- docker - 如何在 distroless 映像中更新 libssl 库
- magento - Magento 2.3 CMS 与 Porto Theme 图像 alt 标签
- mysql - 无法弄清楚“字段列表中的列不明确”
- bash - 在回显之前展开变量内的变量
- javascript - 如何在使用“this”关键字的方法中从其他属性访问对象属性?
- plot - 使用 Gnuplot 绘制等温线
- c++ - 链接器和加载器:静态变量
- typescript - AsyncStorage 没有得到最新的项目