Collectors.toList()返回什么样的List <e>?</e>

时间:2014-02-20 15:32:05

标签: java list lambda java-8 collectors

我正在阅读State of the Lambda: Libraries Edition,我对一个陈述感到惊讶:

Streams 部分下,有以下内容:

List<Shape> blue = shapes.stream()
                         .filter(s -> s.getColor() == BLUE)
                         .collect(Collectors.toList());

该文件没有说明shapes实际上是什么,我不知道它是否重要。

令我困惑的是:这段代码返回了什么样的具体List

  • 它将变量分配给List<Shape>,这完全没问题。
  • stream()filter()决定使用哪种列表。
  • Collectors.toList()既未指定List的具体类型。

那么,List具体类型(子类)在这里使用了什么?有保证吗?

3 个答案:

答案 0 :(得分:90)

  

那么,这里使用了List的具体类型(子类)?有保证吗?

如果查看Collectors#toList()的文档,它会声明 - “返回的List的类型,可变性,可序列化或线程安全性无法保证”。如果您希望返回特定实现,则可以改为使用Collectors#toCollection(Supplier)

Supplier<List<Shape>> supplier = () -> new LinkedList<Shape>();

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(supplier));

从lambda中,您可以返回List<Shape>所需的任何实现。

<强>更新

或者,您甚至可以使用方法参考:

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(LinkedList::new));

答案 1 :(得分:7)

浏览Netbeans(Ctrl + Click),我登陆了这段代码。它似乎使用ArrayList作为供应商。

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

答案 2 :(得分:-1)

没关系,但具体类型是非泛型的,因为所有类型在运行时都是非泛型的。

  

那么,这里使用了List的具体类型(子类)?有保证吗?

我不这么认为,但似乎可能是ArrayList或LinkedList。