IntStream.rangeClosed(x,y) 和 IntStream.range(x,y+1) 的区别

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.RangeIntSpliteratortrue代替false表示该范围被关闭。

然后使用此布尔值来初始化类中的int last字段,Streams.RangeIntSpliterator并针对它提到了以下注释:

1 如果范围是封闭的并且最后一个元素还没有被遍历 否则 0 如果范围是开放的,或者是一个封闭的范围并且所有元素都已经被遍历

为什么这样的实现是必要的,而不是range简单地调用rangeClosed或相反?调用rangeClosed(x,y)而不是调用之间有什么显着区别range(x,y+1)吗?

Gau*_*m M 9

即使在正常情况下没有任何差异,当方法的输入为Integer.

假设rangeClosed(x,y)调用range(x,y+1). 如果您正在调用rangeClosed(0, Integer.MAX_VALUE),那么实际迭代次数将为 0,而不是预期的迭代次数 (2147483648),因为Integer.MAX_VALUE + 1这会导致溢出并返回空流。

如果输入是 ,类似的溢出会导致结果不同Integer.MIN_VALUE