空列表上的 Java 8 流操作

我只是想知道 Java 8流在空列表上的行为是什么。


List<?> emptyList = new ArrayList<>();

List<?> processedList = emptyList.stream().collect(Collectors.toList());

这将是空列表还是null?


我知道流做延迟传播,所以在这种情况下会调用 go tocollect()方法还是会在stream()方法结束?


Cats萌萌
浏览 262回答 2
2回答

慕侠2389804

collect是终端操作,因此必须对其进行评估。使用 终止Stream管道时collect(Collectors.toList()),您将始终获得输出List(您永远不会获得null)。如果Stream是空的(由于流的源为空,或者由于在终端操作之前过滤掉了流的所有元素,它是否为空并不重要),输出List也将为空。

幕布斯7119047

你会得到一个空集合。正如收集在文档中解释的那样:使用收集器对此流的元素执行可变归约操作。和可变减少:可变归约操作在处理流中的元素时将输入元素累积到可变结果容器中,例如 Collection 或 StringBuilder。由于原始输入为空或由于过滤器操作,您将获得一个空集合。感谢@Andy Turner 的提示。事实是 toList() 累积到一个新列表中,这意味着它不会返回 null。并且文档得到了 Collectors.toList() 的解释:返回将输入元素累积到新列表中的收集器。我们可以从源码中得到&nbsp; &nbsp;public static <T>&nbsp; &nbsp; Collector<T, ?, List<T>> toList() {&nbsp; &nbsp; &nbsp; &nbsp; return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(left, right) -> { left.addAll(right); return left; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CH_ID);&nbsp; &nbsp; }它永远不会产生空输出,但您仍然可以使用自定义收集器获得空值,如 Andy 所示。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java