在我看来,当你使用Integer.MAX_VALUE
类的边界创建一个Long.MAX_VALUE
或IntStream
时,不可能将LongStream
和java.util.Random包含为可能的随机值。
这似乎是一种恼人的疏忽。我可以理解为什么他们试图与.doubles()
版本保持一致,但它会尝试获得可能包含最大值的随机int
s或long
s流(但不是全部值,显然,因为有方法这样做)比它需要的复杂得多。
我错过了什么或者在其他地方讨论过这个问题吗?
你是对的。 javadoc声明上限是独占的。这意味着你不能使用ints(lower, upper)
来获得包含Integer.MAX_VALUE
的流。
什么道理呢?
这可能是一个边缘情况,设计师不考虑从1开始,或者他们认为不值得复杂API的“修复”。
请注意Random.nextInt(bound)
有同样的问题,因此自Java 1.2以来Random
的这个缺点已经存在。因此,另一种可能性是设计者在添加ints(...)
和longs(...)
方法时意识到了缺点,但决定不解决它,因为它会导致与旧方法的尴尬不一致。
1 - 这不太可能,IMO。 Java团队是聪明人。从源代码中可以清楚地看出,他们现在已经很清楚这一点了。
无论如何......如果你需要包含MAX_VALUE
s范围的随机数流,你可以使用no-args重载(ints()
和longs()
)并过滤流。或者,您可以滚动自己的流。