Java 流:限制不适用于 Random().ints().sorted()

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 个元素吗?

Rav*_*ala 8

该调用new Random().ints()返回无限的伪随机数流。当你对其进行排序时,它内部使用一个数组。然而,数组的最大大小显然小于\xe2\x88\x9e。要解决该问题,请使用limit首先使用并使流有限,然后执行排序。事实上,这优化了流处理管道,因为您只对必要的元素进行排序。它看起来是这样的。

\n
new Random().ints().limit(100).map(i -> i / 2).sorted().toArray();\n
Run Code Online (Sandbox Code Playgroud)\n

更新

\n

根据下面评论中提出的建议,您可以像这样进一步改进它。

\n
new Random().ints(100).map(i -> i / 2).sorted().toArray();\n
Run Code Online (Sandbox Code Playgroud)\n

ints过程生成一个恰好包含 100 个伪随机数的流,您只需省去limit. 而且,后一种方法比前一种方法更加简洁。

\n

  • 不使用 limit 而是首先创建一个大小合适的流会更简单、更高效: new Random().ints(100).map(i -> i / 2).sorted().toArray(); ` (4认同)