ski*_*iwi 61 java lambda list java-8 collectors
我正在阅读Lambda:Libraries Edition的状态,我对一个声明感到惊讶:
在Streams部分下,有以下内容:
List<Shape> blue = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
该文件没有说明shapes实际是什么,我不知道它是否重要.
令我困惑的是:List这段代码返回了什么样的具体内容?
List<Shape>,这是完全正常的.stream()也filter()决定使用哪种列表.Collectors.toList()既没有指定具体的类型List.那么,这里使用的具体类型(子类)List是什么?有保证吗?
Roh*_*ain 94
那么,这里使用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));
Run Code Online (Sandbox Code Playgroud)
从lambda中,您可以返回您想要的任何实现List<Shape>.
更新:
或者,您甚至可以使用方法参考:
List<Shape> blue = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.collect(Collectors.toCollection(LinkedList::new));
Run Code Online (Sandbox Code Playgroud)
浏览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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50217 次 |
| 最近记录: |