什么是“有效无限流”的意思

时间:2017-11-30 06:19:47

标签: java random java-8 stream java-stream

我正在阅读java 8 Random课程中的新增强功能,并且会重复使用有效无限流这一术语。

考虑IntStream ints(int randomNumberOrigin, int randomNumberBound)

  

返回有效无限的伪随机int值流,   每个符合给定的原点(包括)和约束(不包括)。

有人可以解释一下这个词。

1 个答案:

答案 0 :(得分:5)

这意味着您可以将其视为无限制,但从技术上讲,它可能不是无限制的。例如,openjdk 8u40-b25 implementation会返回Long.MAX_VALUE元素流:

public IntStream ints(int randomNumberOrigin, int randomNumberBound) {
    if (randomNumberOrigin >= randomNumberBound)
        throw new IllegalArgumentException(BadRange);
    return StreamSupport.intStream
            (new RandomIntsSpliterator
                     (this, 0L, Long.MAX_VALUE, randomNumberOrigin, randomNumberBound),
             false);
}

你看到它调用了new RandomIntsSpliterator (this, 0L, Long.MAX_VALUE, randomNumberOrigin, randomNumberBound)

RandomIntsSpliterator的Javadoc说:

  

用于int流的Spliterator。我们将四个int版本复用到一个类中,方法是将一个小于起点的边界视为无界,并将处理“无限”视为等同于Long.MAX_VALUE 。对于拆分,它使用标准的二分法。除类型外,此类的长版和双版本相同。

这意味着“有效无限流”在这里实现为具有大量元素(Long.MAX_VALUE)的实际有限流。出于所有实际目的,我猜它可以被视为无限流,因为任何人都希望使用此方法产生超过Long.MAX_VALUE随机int的可能性非常小。

如果您查看ints的类似变体,它会返回所请求大小的IntStream

public IntStream ints(long streamSize, int randomNumberOrigin,
                      int randomNumberBound) {
    if (streamSize < 0L)
        throw new IllegalArgumentException(BadSize);
    if (randomNumberOrigin >= randomNumberBound)
        throw new IllegalArgumentException(BadRange);
    return StreamSupport.intStream
            (new RandomIntsSpliterator
                     (this, 0L, streamSize, randomNumberOrigin, randomNumberBound),
             false);
}

你看到那个叫

ints(min,max)

相当于调用

ints(Long.MAX_VALUE,min,max)

至少在这个实现中。