从无限流派生的排序流无法迭代,排序无限流会失败吗?
对无限流执行排序操作必然会失败
是的,对无限流执行排序操作一定会失败,你遇到的IllegalArgumentException: Stream size exceeds max array size就是这种场景下的典型异常。
为什么会失败?
Java Stream中的排序操作(比如IntStream.sorted())属于终止操作,它的工作逻辑决定了必须依赖完整的元素集合:
- 排序前需要先收集流中的所有元素,只有拿到全部元素才能进行比较和排序
- 收集元素时,底层会用数组存储这些元素,但Java数组的最大长度被限制为
Integer.MAX_VALUE(约21亿)
而无限流的元素是无穷无尽的,当尝试收集这些元素时,数组很快就会达到最大容量,无法再存储更多元素,最终抛出数组大小超限的异常。
结合你的代码分析
你创建的new Random().ints()是一个无限的IntStream,调用sorted()后,这个操作会试图把所有生成的整数都存入数组准备排序,但无限流永远不会停止产生元素,必然会触发数组大小超过最大值的异常。
解决办法
如果需要对这类流进行排序,必须先通过limit(n)来限制流的元素数量,只截取有限个元素后再执行排序。修改后的代码示例:
import java.util.stream.*; import java.util.*; class TestInfiniteStream { public static void main(String args[]) { IntStream infiniteStream = new Random().ints(); // 先限制流的大小为100,再执行排序 IntStream sortedStream = infiniteStream.limit(100).sorted(); sortedStream.forEach(i -> System.out.println(i)); } }
内容的提问来源于stack exchange,提问作者Rakesh Iyer
相关产品推荐
相关产品推荐

