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流来解决问题时,我错了.如上所述,答案似乎不稳定/可靠.我会在另一个地方重构我的解决方案.谢谢你的帮助〜
没有可靠的方法来做到这一点.即使使用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()会告诉你.