78

我正在阅读State of the Lambda: Libraries Edition,并且对一个声明感到惊讶:

Streams部分下,有以下内容:

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

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

让我感到困惑的是:List这段代码返回了什么样的具体内容?

  • 它将变量分配给 a List<Shape>,这完全没问题。
  • stream()也不filter()决定使用什么样的列表。
  • Collectors.toList()两者都没有指定List.

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

4

3 回答 3

124

那么,这里使用了什么具体类型(子类)的 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));
于 2014-02-20T15:42:12.160 回答
9

通过 Netbeans 导航(Ctrl + 单击),我进入了这段代码。它似乎使用 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);
}
于 2014-02-20T16:03:40.510 回答
0

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

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

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

于 2014-02-20T15:38:25.160 回答