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

2022-09-01 01:22:19

Stream.collect() 的 JavaDoc 表示它返回“减少的结果”。这并不能告诉我像这样的代码是否可以返回 null:filteredList

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

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

它是否记录在是否可以返回 null 的任何地方?Stream.collect()


答案 1

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:

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

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

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

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

  • 将两个结果容器合并为一个(combiner())
  • 在容器上执行可选的最终转换(finisher())

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

所以只要你不做一些奇怪的事情,比如组合函数返回,总是至少返回一个使用你提供的函数。nullCollectormutable containersupplier

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


答案 2

这不依赖于 ,而是取决于单个收集器。 将返回空的 .Stream.collectCollectors.toList()ArrayList

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

.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


推荐