【发布时间】:2014-10-30 09:18:30
【问题描述】:
如何检查 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();
}
【问题讨论】:
-
你不能一边吃蛋糕一边吃——在这种情况下确实如此。您必须使用 流来确定它是否为空。这就是 Stream 语义(惰性)的重点。
-
它最终会被消耗,此时应该进行检查
-
要检查流是否为空,您必须尝试使用至少一个元素。到那时,流已经失去了“童贞”,不能从一开始就再次被消费。
-
@MarkoTopolnik 仅仅因为它是惰性的并不意味着它原则上不能缓冲并重新发送被偷看的元素。查看 vavr 流
标签: java java-8 java-stream