Как мне запустить вложенный сбор в потоке java 8

#java #lambda #java-8 #java-stream

#java #лямбда #java-8 #java-stream

Вопрос:

У меня есть список объектов A, A имеет свойство с именем Address, которое имеет название улицы — StreetName

Из списка объектов A я хочу получить список всех названий улиц. Сбор на одном уровне кажется вполне выполнимым из потоков, но как мне получить вложенную строку, используя одну строку кода.

Итак, для получения списка адресов из объекта A я могу сделать это:

 listOfObjectsA.stream().map(a::getAddress).collect(Collectors.toList());
 

Моя конечная цель — получить список названий улиц, поэтому я не могу определить коллекцию второго уровня, используя лямбды.

Я не смог найти точный пример, который искал. Не мог бы кто-нибудь, пожалуйста, помочь мне с этим.

Комментарии:

1. Не забывайте, что вы также можете использовать одно лямбда-выражение: .map(a -> a.getAddress().getStreetName())

2. @AlexisC. Да, это тоже работает вместе с ответом. Спасибо

Ответ №1:

Вы можете просто связать другую map операцию, чтобы получить названия улиц:

 listOfObjectsA
.stream()
.map(a::getAddress)
.map(a -> a.getStreetName())  // or a::getStreetName
.collect(Collectors.toList());
 

Первый map преобразует ваши объекты в Address объекты, следующий map берет эти Address объекты и преобразует их в street names , которые затем собираются сборщиком.

Потоковые операции образуют конвейер, поэтому вы можете выполнить столько операций, сколько вам нужно, до операций терминала (в данном случае collect операции).