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

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这段代码返回了什么样的具体内容?

  • 它将变量赋值给a 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)

  • 你知道,你可以把那个供应商写成一个lambda :) (4认同)
  • `.collect(Collectors.toCollection(LinkedList <Shape> :: new))`也可以吗? (4认同)
  • @skiwi 或者使用显式类型参数甚至更好:`Collectors.&lt;Shape, List&lt;Shape&gt;&gt;toCollection(LinkedList&lt;Shape&gt;::new)` (2认同)

why*_*yem 8

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

  • 请记住,这只是API的一个潜在实现.:) (4认同)
  • @Trejkaz正确.事实上,我们正在认真考虑在某个时候改变实施. (2认同)