无限 IntStream 的长度?

2022-09-03 09:13:47

我通过以下方式创建了一个随机的IntStream:

 final static PrimitiveIterator.OfInt startValue = new Random().ints(0, 60).iterator();

文档说这个流实际上是无穷无尽的。

我想了解在回合中发生了什么。

ints(0,60)正在生成无限的整数流。如果这是无限的,为什么我的机器没有泄漏任何内存?

我想知道,实际上有多少数字真正生成,这种实现是否会在流仍然结束的地方导致错误?还是这个流会不断地充满新的整数,因此它真的永远不会结束?

如果我已经问过这个问题,那么现在生成随机数的最佳实践是什么?


答案 1

流是无限的¹,因此您可以根据需要生成任意数量的整数,而不会耗尽。这并不意味着当您不要求任何它们时,它会继续生成它们。

实际生成的数字数量取决于您编写的代码。每次从迭代器中检索值时,都会生成一个值。没有在后台生成,因此没有使用“额外”内存。

¹ 就你的一生而言,请参阅Eran的答案


答案 2

确切地说,

IntStream java.util.Random.ints(int randomNumberOrigin, int randomNumberBound) 返回:

伪随机 int 值的有效无限流,每个值都符合给定的原点(包含)和绑定(排除)。

这并不意味着无限。看看Javadoc,你会看到一个实现说明,指出它实际上限制了返回的元素:IntStreamLong.MAX_VALUE

实施说明:

此方法实现为等效于 ints(Long.MAX_VALUE,randomNumberOrigin,randomNumberBound)。

当然是一个非常大的数字,因此返回的可以被视为“有效”无限制。例如,如果您每秒消耗 1000000 个该流,则需要大约 292471 年的时间才能耗尽元素。Long.MAX_VALUEIntStreamint

也就是说,正如其他答案所提到的,它只生成其消费者所需的数量(即消耗s的终端操作)。IntStreamint


推荐