Java 的 Stream.collect() 可以返回 null 吗?

新手上路,请多包涵

Stream.collect() 的 JavaDoc 说它返回“减少的结果”。这并没有告诉我这样的代码是否可以为 filteredList 返回 null :

 List<String> filteredList = inputList.stream()
    .filter(c -> c.isActive())
    .collect(Collectors.toList());

我希望如果它可以返回 null 那么它会返回一个 Optional ,但它也没有这样说。

是否在任何地方记录 Stream.collect() 是否可以返回空值?

原文由 Dean Schulze 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

Collector.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);
}

如您所见 ArrayList::new 被用作您物品的容器。

来自 Collector 的 JavaDoc:

输入元素累积到可变结果容器中 的可变归约操作,在处理完所有输入元素后,可选择将累积结果转换为最终表示。缩减操作可以顺序执行,也可以并行执行。

Collector 由四个函数指定,这些函数协同工作以将条目累积到可变结果容器中,并可选择对结果执行最终转换。他们是:

  • 创建一个新的结果容器(供应商())

  • 将新数据元素合并到结果容器中(累加器())

  • 将两个结果容器合并为一个 (combiner())

  • 对容器执行可选的最终转换 (finisher())

使用收集器的归约的顺序实现将 使用供应商函数创建单个结果容器,并为每个输入元素调用一次累加器函数。并行实现将对输入进行分区,为每个分区 创建一个结果 容器,将每个分区 的内容累积到该分区的子结果中,然后使用组合器函数将子结果合并为组合结果。

So as long as you don’t do weird things like combine function return null , the Collector always return at least a mutable container using your provided supplier 功能。

而且我认为,如果实现会返回 null 容器,这是非常违反直觉的。

原文由 Mạnh Quyết Nguyễn 发布,翻译遵循 CC BY-SA 4.0 许可协议

这不依赖于 Stream.collect ,而是依赖于个人 CollectorCollectors.toList() 将返回一个空的 ArrayList

也就是说,在某些情况下,没有理由不能使用奇怪的 Collector 返回 null :

 .collect(
    Collector.of(
        ArrayList::new,
        ArrayList::add,
        (a, b) -> {
            a.addAll(b);
            return a;
        },
        a -> a.isEmpty() ? null : a  // finisher replaces empty list with null
    )
);

所以 Collector 是您需要记住要检查的内容。我相信所有 开箱即用的 Collectors 都将返回空集合,正如您所期望的那样。

原文由 Michael 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题