我在 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)
有人可以解释为什么这是一个无限流吗?
第一件事是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 中都提到了它们的操作类型。
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |