繁体   English   中英

Java 8:Stream.filter 没有按预期运行

[英]Java 8 : Stream.filter not running as expected

鉴于:

    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,无论终端操作是否短路,它们都应该遍历列表中的每个项目,对吗?

无需检查整个 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 即可返回的能力正是使操作(如findFirst )短路的原因。 请参阅流 javadoc

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

第一个 Stream 的想法是迭代找到“pen”的第一次出现,因此 Predicate 迭代数组,直到找到与过滤器条件匹配的第一个元素。 因此,您只会看到两个“0:”。 官方文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM