Stream count 是不是没有终端操作?

问题描述 投票:0回答:1
public static void main(String[] args) throws IOException {

    List<String> lst = new ArrayList<>();
    lst.add("Alpha");
    lst.add("Beta");
    lst.add("Gamma");

    String joinResult = lst.stream().peek(x->System.out.println(x)).map(x -> {
        System.out.println("In the middle");return x+"3";}).peek(System.out::println).collect(Collectors.joining());
    System.out.println(joinResult);
}

最后我没有使用collect(Collectors.joining()),而是使用了count()。但是没有打印任何内容。 那么count()不是终结操作吗? count 返回一个 long 值,所以应该是这样。真的很奇怪。

上面的代码从头到尾打印每个元素。 Alpha -> 中间 ->Alpha3 Beta -> 中间 -> Beta3 等等

这就是流的工作原理吗?每个元素都从头到尾处理过?

java java-stream
1个回答
0
投票

您的流源(

ArrayList
)具有已知的大小,中间操作(
map()
peek()
)不会影响该大小,因此
count()
可以在不调用中间操作的情况下确定结果。

这在

Stream.count()
的文档中明确提到:

API说明:

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

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

流源覆盖的元素数量

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

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