Java 为什么有极限的溪流是无限的?
我在Eclipse中运行了以下代码:Java 为什么有极限的溪流是无限的?,java,java-stream,Java,Java Stream,我在Eclipse中运行了以下代码: Stream.generate(() -> "Elsa") .filter(n -> n.length() ==4) .sorted() .limit(2) .forEach(System.out::println); 输出为: 线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间 我所期待的是,因为限制是两个: Elsa Elsa
Stream.generate(() -> "Elsa")
.filter(n -> n.length() ==4)
.sorted()
.limit(2)
.forEach(System.out::println);
输出为:
线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间
我所期待的是,因为限制是两个:
Elsa
Elsa
有人能解释一下为什么这是一条无限流吗
有人能解释一下为什么这是一条无限流吗
因为这正是Stream.generate()
创建的:
返回无限顺序无序流,其中每个元素由提供的供应商生成
然后,当您将其与排序()相结合时,您告诉它在无限序列上开始排序,这显然会导致JVM内存不足。第一件事是创建无限流。这就是为什么流最初是无限的
通过使用将流限制为两个元素,这将使其有限
但是,问题是您调用了sorted()
,它试图使用整个流。排序前需要限制流:
Stream.generate(() -> "Elsa")
.filter(n -> n.length() == 4)
.limit(2)
.sorted()
.forEach(System.out::println);
文档中说“是一个有状态的中间操作”。有关有状态中间操作的Streams文档:
有状态操作可能需要在生成结果之前处理整个输入。例如,在看到流的所有元素之前,无法对流进行排序产生任何结果
我的
就在那里。还请注意,对于所有流操作,它们的操作类型都在Javadocs中提到。您应该查看部分文档。特别是
sorted
不是一个惰性操作,所以它需要整个流。@JoopEggen很好的调用。更新。