为什么有极限的流是无限的?

san*_*san -2 java java-stream

我在 Eclipse 中运行了以下代码:

Stream.generate(() -> "Elsa")
      .filter(n -> n.length() ==4)
      .sorted()
      .limit(2)
      .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

输出是:

线程“main”中的异常 java.lang.OutOfMemoryError: Java heap space

由于限制是两个,我期待的是:

Elsa
Elsa
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这是一个无限流吗?

MC *_*ror 8

第一件事是Stream::generate创建一个无限流。这就是为什么流最初是无限的。

您可以使用 将流限制为两个元素Stream::limit,这将使其成为有限的。

但是,问题在于您调用sorted(),它试图消耗整个流。您需要排序之前限制流:

Stream.generate(() -> "Elsa")
    .filter(n -> n.length() == 4)
    .limit(2)
    .sorted()
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

文档说“是一个有状态的中间操作”。关于有状态中间操作的 Streams 文档很好地解释了它Stream::sorted()

有状态操作可能需要在产生结果之前处理整个输入。例如,在看到流的所有元素之前无法通过对流进行排序来产生任何结果

强调我的。

就是这样。另请注意,对于所有 Stream 操作,Javadocs 中都提到了它们的操作类型。