Что за список делают коллекционеры.список() вернуть?
Я читаю состояние лямбда: библиотеки издание, и меня удивляет одно утверждение:
в разделе потоки, есть следующее:
List<Shape> blue = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.collect(Collectors.toList());
в документе не указывается, что shapes
на самом деле, и я не знаю, если это важно.
меня смущает следующее: какой бетон List
возвращает ли этот блок кода?
- он назначает переменной
List<Shape>
, что совершенно нормально. -
stream()
, ниfilter()
решите, какой список использовать. -
Collectors.toList()
ни указывает конкретный типList
.
так что б тип (подкласс)List
используется здесь? Есть ли какие-то гарантии?
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 кажутся вероятными.