我如何检查 Stream
是否为空,如果不是,则作为非终端操作抛出异常?
基本上,我正在寻找与下面的代码等效的东西,但没有具体化中间的流。特别是,检查不应发生在终端操作实际使用流之前。
public Stream<Thing> getFilteredThings() {
Stream<Thing> stream = getThings().stream()
.filter(Thing::isFoo)
.filter(Thing::isBar);
return nonEmptyStream(stream, () -> {
throw new RuntimeException("No foo bar things available")
});
}
private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) {
List<T> list = stream.collect(Collectors.toList());
if (list.isEmpty()) list.add(defaultValue.get());
return list.stream();
}
原文由 Cephalopod 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您可以忍受有限的并行能力,以下解决方案将起作用:
下面是一些使用它的示例代码:
(高效)并行执行的问题在于,支持拆分
Spliterator
需要一种线程安全的方式来注意是否有任何一个片段以线程安全的方式看到了任何值。然后执行tryAdvance
的最后一个片段必须意识到它是最后一个(并且它也无法前进)抛出适当的异常。所以这里我没有添加对拆分的支持。