2 回答
TA贡献1719条经验 获得超6个赞
collect
是终端操作,因此必须对其进行评估。
使用 终止Stream
管道时collect(Collectors.toList())
,您将始终获得输出List
(您永远不会获得null
)。如果Stream
是空的(由于流的源为空,或者由于在终端操作之前过滤掉了流的所有元素,它是否为空并不重要),输出List
也将为空。
TA贡献1794条经验 获得超8个赞
你会得到一个空集合。正如收集在文档中解释的那样:
使用收集器对此流的元素执行可变归约操作。
和可变减少:
可变归约操作在处理流中的元素时将输入元素累积到可变结果容器中,例如 Collection 或 StringBuilder。
由于原始输入为空或由于过滤器操作,您将获得一个空集合。
感谢@Andy Turner 的提示。
事实是 toList() 累积到一个新列表中,这意味着它不会返回 null。
并且文档得到了 Collectors.toList() 的解释:
返回将输入元素累积到新列表中的收集器。
我们可以从源码中得到
public static <T>
Collector<T, ?, List<T>> toList() {
return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
它永远不会产生空输出,但您仍然可以使用自定义收集器获得空值,如 Andy 所示。
添加回答
举报