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似乎是可能的。