Collectors.toList()返回哪种List <E>?


70

我正在阅读Lambda状态:图书馆版,但对以下陈述感到惊讶:

Streams部分下,有以下内容:

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

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

让我感到困惑的是:List此代码块返回什么样的具体代码?

  • 它将变量分配给List<Shape>,这是完全可以的。
  • stream()也不filter()决定要使用哪种列表。
  • Collectors.toList()均未指定的具体类型List

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


由于该toUnmodifiableList()方法是在Java 10中添加的,因此现在似乎toList()可以保证的可变性。
jaco0646

Answers:


109

那么,这里使用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));

4
您知道,您可以将Supplier称为lambda :)
Joeri Hendrickx 2014年

5
.collect(Collectors.toCollection(LinkedList<Shape>::new))还工作吗?
skiwi 2014年

2
@skiwi甚至使用显式类型参数甚至更好:Collectors.<Shape, List<Shape>>toCollection(LinkedList<Shape>::new)
Rohit Jain

1
@panos unmodifiableableList是一个“不可变的Claytons”,但是如果您想要一个实际上不可变的集合(例如番石榴中的一个),则最终要编写自己的收集器。不过,想一想,真正的遗憾是toList()最初没有返回不可变的列表。
Trejkaz

1
@Trejkaz同意,toList首先应该返回一个不可变的,但是哦,没错。我们希望在某个时候改变这一点。另外,什么是“不变形的粘土”?
斯图尔特(Stuart Marks)

8

浏览Netbeans(Ctrl +单击),我进入了这段代码。似乎正在使用ArrayList作为Supplier。

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);
}

4
请记住,这只是该API的一种潜在实现。:)
Trejkaz

4
@Trejkaz正确。实际上,我们正在认真考虑在某个时候更改实现。
斯图尔特(Stuart Marks)

-1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.