为什么 count() 终端操作不打印中间步骤?

mic*_*wth 4 java java-stream

很简单:

import java.util.stream.*;

public class MyClass {
  public static void main(String args[]) {
    Long x = Stream.of(1, 2, 3).map(i -> {
      System.out.println(i);
      return i + 4;
    }).count();

    System.out.println(x); // prints '3'
  }
}
Run Code Online (Sandbox Code Playgroud)

这里count()用于触发中间操作,其中包括System.out.println(i),但不会从内部打印任何内容map()。这是为什么?

Dun*_*ncG 10

count()的 javadoc指出:

如果实现能够直接从流源计算计数,则它可以选择不执行流管道(顺序或并行)。在这种情况下,不会遍历任何源元素,也不会评估任何中间操作。

  • 这是来自 [jdk8](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#count--) 的更新 (2认同)

ILy*_*one 9

流是懒惰聪明的。由于您的终端操作是count,它不关心单个元素,而只关心它们的数量,因此map不会被调用。
替换count为需要计算各个元素的内容,例如sum- 和mapwill be called。

Long x = Stream.of(1, 2, 3).map(i -> {
            System.out.println(i);
            return i + 4;
        })
        .mapToLong(Long::valueOf)
        .sum(); // prints 1 2 3

        System.out.println(x); // prints 18
Run Code Online (Sandbox Code Playgroud)

评论中的人也正确地提醒您副作用。