有没有办法检查Java中的流是否有限?

Hea*_*ren 3 java java-8 java-stream

我知道Java中有无限的流.

有没有办法检查流是否有限?

像这种方法的东西isStreamFinite(Stream<T> stream)

@Test
public void testStreamFinity() {
    assertFalse(isStreamFinite(generateLong()));
}

private <T> boolean isStreamFinite(Stream<T> stream) {
    if (stream.count() < Long.MAX_VALUE) {
        return true;
    }
    return false;
}

private Stream<Long> generateLong() {
    return LongStream.generate(() -> new Random().nextLong()).boxed();
}
Run Code Online (Sandbox Code Playgroud)

Stream的构造会留下一些标记/轨迹,我们可以用它来追溯检查它吗?

检查方法是可靠的预期总是能工作吗?

更新

在尝试通过检测isFinite流来解决问题时,我错了.如上所述,答案似乎不稳定/可靠.我会在另一个地方重构我的解决方案.谢谢你的帮助〜

Eug*_*ene 7

没有可靠的方法来做到这一点.即使使用estimateSize,记录:

...或者如果计算无限,未知或太昂贵,则返回Long.MAX_VALUE.

因此,简单地依靠Long.MAX_VALUE将告诉您此流是否无限的事实- 简直是错误的.

另一个建议说要使用SIZED,这又是错误的:

IntStream.generate(() -> 1).limit(5)
Run Code Online (Sandbox Code Playgroud)

知道这是一个SIZED流 - 实现不会也不会报告大小的标志.

底线:你不能以可靠的方式.从理论上讲,这可能适用于某些情况,例如当你使用generate而不限制或短路流时,实现可以注册一个标志IS_INFINITE或类似的东西,但这个IMO将是无用的,可能是99%的情况.

你也可以反过来想一想,当你想确定这个流是否有限的时候怎么样?在这种情况下,getExactSizeIfKnown()会告诉你.

  • 不要忘记,没有人知道`IntStream.generate(() - > 1).takeWhile(x - > externalCondition(x))`是否有限... (3认同)