Java Stream API - 惰性求值

问题描述 投票:0回答:1

此代码不打印任何内容:

List.of("a","b","c","D").stream()
    .map(m -> {
        System.out.println(m);
        return m;
    })
    .count();

如果我添加过滤器阶段,它就会打印。

List.of("a","b","c","D").stream()
    .filter(f -> f.matches("[a-z]"))
    .map(m -> {
        System.out.println(m);
        return m;
    })
    .count();

这是为什么?

java java-stream lazy-evaluation
1个回答
0
投票

这在

count

的文档中有明确说明

如果实现能够直接从流源计算计数,则可以选择不执行流管道(顺序或并行)。在这种情况下,不会遍历任何源元素,也不会评估任何中间操作。具有副作用的行为参数可能会受到影响,除非调试等无害情况,否则强烈建议不要这样做。例如,考虑以下流:

List<String> l = Arrays.asList("A", "B", "C", "D");
long count = l.stream().peek(System.out::println).count();

流源(列表)覆盖的元素数量是已知的,中间操作 peek 不会注入流或从流中删除元素(可能是 flatMap 或过滤器操作的情况)。因此,计数就是列表的大小,不需要执行管道,并且作为副作用,打印出列表元素。

© www.soinside.com 2019 - 2024. All rights reserved.