是否可以编写一个在有结果时提前退出的 Java 收集器?

Mic*_*Kay 7 java java-8 java-stream

是否可以实现一个一旦有答案就停止处理流的收集器?

例如,如果收集器正在计算平均值,并且其中一个值是 NaN,我知道答案将是 NaN,而不会看到更多值,因此进一步的计算是没有意义的。

Mic*_*Kay 2

感谢您的回复。这些评论指出了解决方案的方向,我将在这里进行描述。它很大程度上受到 StreamEx 的启发,但适应了我的特殊情况。

首先,我定义了一个名为 XdmStream 的 Stream 实现,它通常将所有方法委托给它所包装的底层 Stream。

这立即使我有机会定义新方法,例如我的用户可以代替stream.last()stream.reduce((first,second)->second)这是一个有用的便利。

作为短路方法的示例,我实现XdmStream.untilFirst(Predicate)如下(base是包装的 Stream)。此方法的想法是返回一个流,该流提供与原始流相同的结果,只不过当满足谓词时,不再提供更多结果。

public XdmStream<T> untilFirst(Predicate<? super XdmItem> predicate) {
    Stream<T> stoppable = base.peek(item -> {
        if (predicate.test(item)) {
            base.close();
        }
    });
    return new XdmStream<T>(stoppable);
}
Run Code Online (Sandbox Code Playgroud)

当我第一次创建基本 Stream 时,我调用它的onClose()方法,以便对 close() 的调用触发数据提供者停止提供数据。

close()机制似乎没有特别详细的记录(它依赖于“流管道”的概念,并且当某种方法返回的新流与原始流属于同一管道的一部分时,并不完全清楚) - 但它适用于我。我想我应该确保这只是一种优化,这样即使数据流没有立即关闭(例如,如果流中有任何缓冲),结果仍然是正确的。