Java8:流。筛选器未按预期运行
鉴于:
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:”会被打印两次,而不仅仅是一次,而不是五次
# 1 楼答案
在不检查整个流的情况下返回的能力正是导致操作(如
findFirst
)短路的原因。见Streams javadocStreams文档实际上没有承诺如何或是否对谓词求值。它只保证返回与谓词匹配的流的第一个元素
# 2 楼答案
第一个流的思想是迭代以找到“pen”的第一个匹配项,因此谓词迭代数组,直到找到与过滤器条件匹配的第一个元素。因此,您只能看到两个“0:”Official documentation