给定:
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:
str.stream().filter(test).collect(Collectors.toList());
让我困惑的是,无论是findFirst还是collect,无论终端操作是否短路都应该遍历列表中的每一项,对吧?
那么为什么";0:";打印两次,而不仅仅是一次5次
让我困惑的是,无论是findFirst还是collect,无论终端操作是否短路,它们都应该遍历列表中的每一项,对吧?
在不检查整个流的情况下返回的能力正是导致操作(如findFirst
(短路的原因。请参阅Streams javadoc。
Streams文档实际上并没有承诺如何或是否评估谓词。它只是保证它将返回流中与谓词匹配的第一个元素。
第一个Stream的想法是迭代以找到第一个出现的"笔";,因此Predicate迭代数组,直到找到与过滤器条件匹配的第一个元素。因此,你只能看到两个";0:";。官方文件