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

我正在阅读“Lambda:Libraries”(图书馆版)的状态 ,并对一个声明感到惊讶:

根据Streams部分,有以下几点:

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

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

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

  • 它将variables分配给List<Shape> ,这是完全正确的。
  • stream()filter()决定使用什么样的列表。
  • Collectors.toList()既不指定List的具体types。

那么,这里使用了List 具体types(子类)呢? 有任何保证吗?

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

如果您查看Collectors#toList()的文档,它将声明: “对返回的List的types,可变性,可串行性或线程安全性没有保证 。 如果您想要返回特定的实现,则可以使用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)); 

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

这并不重要,但具体types是非generics的,因为所有types在运行时都是非generics的。

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

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