Подтвердить что ты не робот

Какой Список <E> возвращает Collectors.toList()?

Я читаю Состояние Lambda: Libraries Edition, и меня удивляет одно утверждение:

В разделе Потоки есть следующее:

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

В документе не указано, что на самом деле есть shapes, и я не знаю, имеет ли это значение даже.

Что меня смущает, так это: Какой конкретный List возвращает этот блок кода?

  • Он присваивает переменной значение List<Shape>, что вполне нормально.
  • stream() и filter() решить, какой список использовать.
  • Collectors.toList() не указывается конкретный тип List.

Итак, какой тип конкретный (подкласс) List используется здесь? Существуют ли какие-либо гарантии?

4b9b3361

Ответ 1

Итак, какой конкретный тип (подкласс) List используется здесь? Существуют ли какие-либо гарантии?

Если вы посмотрите документацию Collectors#toList(), в нем говорится, что - "Нет никаких гарантий в отношении типа, изменчивости, сериализуемости, или безопасность потока в списке возвращена". Если вы хотите, чтобы конкретная реализация была возвращена, вы можете вместо этого использовать Collectors#toCollection(Supplier).

Supplier<List<Shape>> supplier = () -> new LinkedList<Shape>();

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

И из лямбды вы можете вернуть любую реализацию, которая вам нужна List<Shape>.

Обновление

Или вы даже можете использовать ссылку на метод:

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(LinkedList::new));

Ответ 2

Перемещение по 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);
}

Ответ 3

Это не имеет значения, но конкретный тип не является общим, так как действительно все типы не являются универсальными во время выполнения.

Итак, какой конкретный тип (подкласс) List используется здесь? Существуют ли какие-либо гарантии?

Я так не думаю, но ArrayList или LinkedList кажутся вероятными.