我在读Lambda 的现状:图书馆版 http://cr.openjdk.java.net/~briangoetz/lambda/lambda-libraries-final.html,并且我对一项声明感到惊讶:
在该部分下Streams,有如下:
List<Shape> blue = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.collect(Collectors.toList());
该文件没有说明什么shapes
事实上是这样,我不知道这是否重要。
让我困惑的是:什么样的混凝土List
这段代码有返回吗?
- 它将变量分配给
List<Shape>
,这完全没问题。
-
stream()
nor filter()
决定使用哪种列表。
-
Collectors.toList()
都没有指定具体类型List
.
所以呢concrete的类型(子类)List
在这里被使用吗?有任何保证吗?
那么,这里使用的 List 的具体类型(子类)是什么?有任何保证吗?
如果你看一下文档Collectors#toList() https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/stream/Collectors.html#toList(),它指出 -“不保证返回列表的类型、可变性、可序列化性或线程安全性”。如果您想要返回特定的实现,您可以使用Collectors#toCollection(Supplier) https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/stream/Collectors.html#toCollection(java.util.function.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>
.
Update:
或者,您甚至可以使用方法参考:
List<Shape> blue = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.collect(Collectors.toCollection(LinkedList::new));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)