【发布时间】:2021-04-05 17:18:25
【问题描述】:
给定:
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 次? p>
【问题讨论】:
-
当 API 读取“find first”时,为什么会期望它进一步迭代?
-
您的计数打印使用的是后增量,并且始终为零。
标签: java java-8 java-stream short-circuiting