我知道有infiniteJava 中的流。
有没有办法检查流是否是有限的?
像这样的方法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();
}
的建设Stream会留下一些标记/轨迹我们可以用它来追溯检查吗?
The 检查方法能否始终按预期可靠地工作?
Update
当我试图通过检测来解决问题时,我错了isFinite
一条流的。正如所提到的答案所示,它似乎并不稳定/可靠。我将在另一个方面重构我的解决方案。谢谢你的帮助~
没有可靠的方法可以做到这一点。即使使用estimateSize
,记录如下:
...或者如果无限、未知或计算成本太高则返回 Long.MAX_VALUE。
所以仅仅依靠这样一个事实Long.MAX_VALUE
会告诉你这个流是否是无限的——这是完全错误的。
另一个建议说要使用SIZED
,这又是错误的:
IntStream.generate(() -> 1).limit(5)
You know这是一个SIZED
流 - 实施不会并且将会not报告大小的标志。
底线:你不能以可靠的方式。从理论上讲,这在某些情况下是可能的,例如当您just use generate
在不限制或短路流的情况下,实现可以注册一个标志,例如IS_INFINITE
或其他什么,但这个 IMO 可能对 99% 的情况都是无用的。
你也可以在这里反向思考,当你想确定地判断这个流是否是有限的时怎么样?在这种情况下,getExactSizeIfKnown()
会告诉你的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)