Что за список делают коллекционеры.список() вернуть?


Я читаю состояние лямбда: библиотеки издание, и меня удивляет одно утверждение:

в разделе потоки, есть следующее:

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

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

меня смущает следующее: какой бетон List возвращает ли этот блок кода?

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

так что б тип (подкласс)List используется здесь? Есть ли какие-то гарантии?

3 52

3 ответа:

Итак, какой конкретный тип (подкласс) списка используется здесь? Есть ли какие-то гарантии?

если вы посмотрите на документация 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));

переходя через 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);
}

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

Итак, какой конкретный тип (подкласс) списка используется здесь? Есть ли какие-то гарантии?

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