我知道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();
}
Stream的构造会留下一些标记/痕迹,我们可以使用这些痕迹/痕迹进行追溯检查吗?
该检查方法为可靠预计总能工作吗?
尝试通过检测isFinite
流的来解决问题时,我对此有误。所提到的答案似乎并不稳定/可靠。我将在其他地方重构我的解决方案。谢谢你的帮助〜
没有可靠的方法可以做到这一点。即使使用estimateSize
已记录的,也可以:
...或返回Long.MAX_VALUE(如果无穷大,未知或计算成本太高)。
因此,仅仅依靠Long.MAX_VALUE
将告诉您此流是否无限的事实是完全错误的。
另一个建议是使用use SIZED
,这又是错误的:
IntStream.generate(() -> 1).limit(5)
您知道这是一个SIZED
流-实现不会并且不会报告size标志。
底线:您不能以可靠的方式。从理论上讲,在某些情况下这是可能的,例如,当您仅使用generate
而不限制或短路流时,实现可以注册一个类似之类的标志IS_INFINITE
,但是此IMO将无用,可能在99%的情况下。
您还可以在这里反过来考虑,当您想确定地确定此流是否有限时,该怎么办?在这种情况下,请getExactSizeIfKnown()
告诉您。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句