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:

str.stream().filter(test).collect(Collectors.toList());

让我困惑的是,无论是findFirst还是collect,无论终端操作是否短路都应该遍历列表中的每一项,对吧?

那么为什么";0:";打印两次,而不仅仅是一次5次

让我困惑的是,无论是findFirst还是collect,无论终端操作是否短路,它们都应该遍历列表中的每一项,对吧?

在不检查整个流的情况下返回的能力正是导致操作(如findFirst(短路的原因。请参阅Streams javadoc。

Streams文档实际上并没有承诺如何或是否评估谓词。它只是保证它将返回流中与谓词匹配的第一个元素。

第一个Stream的想法是迭代以找到第一个出现的"笔";,因此Predicate迭代数组,直到找到与过滤器条件匹配的第一个元素。因此,你只能看到两个";0:";。官方文件

最新更新