Mic*_*Kay 7 java java-8 java-stream
是否可以实现一个一旦有答案就停止处理流的收集器?
例如,如果收集器正在计算平均值,并且其中一个值是 NaN,我知道答案将是 NaN,而不会看到更多值,因此进一步的计算是没有意义的。
感谢您的回复。这些评论指出了解决方案的方向,我将在这里进行描述。它很大程度上受到 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()机制似乎没有特别详细的记录(它依赖于“流管道”的概念,并且当某种方法返回的新流与原始流属于同一管道的一部分时,并不完全清楚) - 但它适用于我。我想我应该确保这只是一种优化,这样即使数据流没有立即关闭(例如,如果流中有任何缓冲),结果仍然是正确的。