为了账号安全,请及时绑定邮箱和手机立即绑定

空列表上的 Java 8 流操作

空列表上的 Java 8 流操作

Cats萌萌 2022-06-04 10:42:40
我只是想知道 Java 8流在空列表上的行为是什么。List<?> emptyList = new ArrayList<>();List<?> processedList = emptyList.stream().collect(Collectors.toList());这将是空列表还是null?我知道流做延迟传播,所以在这种情况下会调用 go tocollect()方法还是会在stream()方法结束?
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

collect是终端操作,因此必须对其进行评估。

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


查看完整回答
反对 回复 2022-06-04
?
幕布斯7119047

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 所示。


查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 261 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信