Gau*_*m M 1 java java-8 java-stream
IntStream.range(x,y)将从x(inclusive)和y(exclusive)返回一个流。
IntStream.rangeClosed(x,y)将从x(inclusive)和y(inclusive)返回一个流。
我希望rangeClosed(x,y)调用range(x,y-1)或range(x,y)调用rangeClosed(x,y-1). 但是在查看range它的源代码时,它就像:
if (startInclusive >= endExclusive) {
return empty();
} else {
return StreamSupport.intStream(
new Streams.RangeIntSpliterator(startInclusive, endExclusive, false /*not closed*/), false);
}
Run Code Online (Sandbox Code Playgroud)
该rangeClosed也有一个非常相似的实现,而不是range(x,y+1)。唯一的区别是,第三个参数Streams.RangeIntSpliterator是true代替false表示该范围被关闭。
然后使用此布尔值来初始化类中的int last字段,Streams.RangeIntSpliterator并针对它提到了以下注释:
1 如果范围是封闭的并且最后一个元素还没有被遍历 否则 0 如果范围是开放的,或者是一个封闭的范围并且所有元素都已经被遍历
为什么这样的实现是必要的,而不是range简单地调用rangeClosed或相反?调用rangeClosed(x,y)而不是调用之间有什么显着区别range(x,y+1)吗?
即使在正常情况下没有任何差异,当方法的输入为Integer.
假设rangeClosed(x,y)调用range(x,y+1). 如果您正在调用rangeClosed(0, Integer.MAX_VALUE),那么实际迭代次数将为 0,而不是预期的迭代次数 (2147483648),因为Integer.MAX_VALUE + 1这会导致溢出并返回空流。
如果输入是 ,类似的溢出会导致结果不同Integer.MIN_VALUE。