Какъв е правилният начин за замяна на вложен for цикъл с потоци в Java 8?

Докато изучавах Java 8 потоци и lambas, се опитах да заменя следните вложени for цикли с потоци:

List<Long> deskIds = new ArrayList<>();
for(ProvidedService memberService : service.getAllNodesDepthFirst()){
   for(Desk d : memberService.getDesks()){
     deskIds.add(d.getId());
   }
}

Цикълът итерира списък от обекти „ProvidedService“ и за всеки от тях итерира свойство на списък на обекти „Desk“ и извлича полето „Id“ в списък.

Измислих следния код, използвайки потоци:

List<Long> deskIds = new ArrayList<>();
service.getAllNodesDepthFirst().stream().forEach(srv -> {
    deskIds.addAll(srv.getDesks().stream().map(Desk::getId).collect(Collectors.toList()));
});

Това ли е правилният/оптималният начин да го направите? Или има начин да направите това без втория вложен поток?


person Pierre Henry    schedule 27.11.2014    source източник
comment
Мисля, че е добре. Няма проблем с вашия подход.   -  person Prakhar Asthana    schedule 27.11.2014
comment
За повече вижте тази връзка: oracle. com/technetwork/articles/java/   -  person Prakhar Asthana    schedule 27.11.2014
comment
@Prakhar: да, моят подход проработи, но беше малко наивен и си помислих, че трябва да има някакъв начин да го рационализирам, както беше демонстрирано от assylias.   -  person Pierre Henry    schedule 27.11.2014


Отговори (1)


Вероятно бих го написал така:

List<Long> deskIds = service.getAllNodesDepthFirst().stream()
                                          .flatMap(p -> p.getDesks().stream())
                                          .map(Desk::getId)
                                          .collect(toList());
person assylias    schedule 27.11.2014
comment
Да, надявах се да има нещо като "flatMap"! - person Pierre Henry; 27.11.2014
comment
@assylias Има ли някакъв лесен начин, ако искам да получа карта накрая вместо списък, където картата е някакъв идентификатор на ProvidedService, а стойността е идентификатор на бюро. - person Naman; 29.09.2016
comment
@assylias Разгледах groupingBy, но изглежда, че мога да получа Map‹String, List‹String››, но не искам това, надявах се да получа Map‹String, String›. Можете ли да предложите дали мога да го получа? - person Naman; 30.09.2016
comment
Би било логично да зададете отделен въпрос за вашия конкретен виж случай. - person assylias; 01.10.2016