Man*_*oid 2 java java-8 java-stream
我有以下代码:
new Random().ints()
.map(i -> i / 2)
.limit(100)
.toArray()
Run Code Online (Sandbox Code Playgroud)
...并且它按预期工作。
但这不起作用:
new Random().ints()
.sorted()
.map(i -> i / 2)
.limit(100)
.toArray()
Run Code Online (Sandbox Code Playgroud)
它抛出:
Exception in thread "main" java.lang.IllegalArgumentException: Stream size exceeds max array size
Run Code Online (Sandbox Code Playgroud)
limit 不应该使流短路并帮助将其限制为 100 个元素吗?
该调用new Random().ints()返回无限的伪随机数流。当你对其进行排序时,它内部使用一个数组。然而,数组的最大大小显然小于\xe2\x88\x9e。要解决该问题,请使用limit首先使用并使流有限,然后执行排序。事实上,这优化了流处理管道,因为您只对必要的元素进行排序。它看起来是这样的。
new Random().ints().limit(100).map(i -> i / 2).sorted().toArray();\nRun Code Online (Sandbox Code Playgroud)\n更新
\n根据下面评论中提出的建议,您可以像这样进一步改进它。
\nnew Random().ints(100).map(i -> i / 2).sorted().toArray();\nRun Code Online (Sandbox Code Playgroud)\n该ints过程生成一个恰好包含 100 个伪随机数的流,您只需省去limit. 而且,后一种方法比前一种方法更加简洁。