此代码不打印任何内容:
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();
这是为什么?
count
的文档中有明确说明
如果实现能够直接从流源计算计数,则可以选择不执行流管道(顺序或并行)。在这种情况下,不会遍历任何源元素,也不会评估任何中间操作。具有副作用的行为参数可能会受到影响,除非调试等无害情况,否则强烈建议不要这样做。例如,考虑以下流:
List<String> l = Arrays.asList("A", "B", "C", "D"); long count = l.stream().peek(System.out::println).count();
流源(列表)覆盖的元素数量是已知的,中间操作 peek 不会注入流或从流中删除元素(可能是 flatMap 或过滤器操作的情况)。因此,计数就是列表的大小,不需要执行管道,并且作为副作用,打印出列表元素。