Java8: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 文档实际上并未承诺如何或是否评估您的谓词。它只是保证它将返回与谓词匹配的流的第一个元素。


以上是Java8:Stream.filter未按预期运行的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>