Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么有极限的溪流是无限的?_Java_Java Stream - Fatal编程技术网

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

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

我在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()
创建的:

返回无限顺序无序流,其中每个元素由提供的供应商生成

然后,当您将其与排序()相结合时,您告诉它在无限序列上开始排序,这显然会导致JVM内存不足。

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

通过使用将流限制为两个元素,这将使其有限

但是,问题是您调用了
sorted()
,它试图使用整个流。排序前需要限制流:

Stream.generate(() -> "Elsa")
    .filter(n -> n.length() == 4)
    .limit(2)
    .sorted()
    .forEach(System.out::println);
文档中说“是一个有状态的中间操作”。有关有状态中间操作的Streams文档:

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

我的


就在那里。还请注意,对于所有流操作,它们的操作类型都在Javadocs中提到。

您应该查看部分文档。特别是
sorted
不是一个惰性操作,所以它需要整个流。@JoopEggen很好的调用。更新。