代码之家  ›  专栏  ›  技术社区  ›  Hearen

有没有办法检查java中的流是否是有限的?[关闭]

  •  3
  • Hearen  · 技术社区  · 7 年前

    我知道有 无限的 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();
    }
    

    建造 溪流 会留下一些 标记/轨迹 我们可以用它来追查吗?

    这个 检查方法 工作是否总是如预期的那样可靠?

    更新

    当我试图通过检测 isFinite 一条小溪。似乎不像上面提到的那样稳定/可靠。我将在另一个地方重构我的解决方案。谢谢你的帮助~

    2 回复  |  直到 7 年前
        1
  •  7
  •   Eugene    7 年前

    没有可靠的方法来做这件事。即使使用 estimateSize ,记录如下:

    …或返回long.max_值(如果无限、未知或计算成本太高)。

    所以简单地说 Long.MAX_VALUE 会告诉你这个流是无限的还是不无限的-完全是错误的。

    另一个建议是 SIZED ,这又是错误的:

    IntStream.generate(() -> 1).limit(5)
    

    知道 这是一个 大小 流——实现不会也不会 报告大小标志。

    一句话:你不能用可靠的方式。理论上这在某些情况下是可能的,比如 只是 使用 generate 在不限制或短路流的情况下,实现可以注册一个标志 IS_INFINITE 或者别的什么,但这个imo可能没用,99%的案子都是这样。

    你也可以逆向思考,当你想确定这条流是否是有限的时,如何?在这种情况下, getExactSizeIfKnown() 会告诉你的。

        2
  •  2
  •   Mark Jeronimus    7 年前

    无法确定流是否是无限的,但可以确定流是否是有限的。

    [修正]我搞错了。

    /**
     * When this returns {@code true}, the stream is finite for sure. Otherwise the
     * stream could be either infinite or finite.
     */
    private static <T> boolean isStreamFinite(Stream<T> stream) {
        return stream.spliterator().estimateSize() != Long.MAX_VALUE;
    }
    

    javadoc的 estimateSize() 以下内容:

    返回A将遇到的元素数量的估计值。 forEachRemaining 遍历或返回 Long.MAX_VALUE 如果是无限的,未知的,或者太贵而无法计算。