2014-11-27 22 views
22

Ucząc Java 8 strumieni i lambas, starałem się wymienić następujące zagnieżdżone pętle ze strumieniami:Jaki jest właściwy sposób zastępowania zagnieżdżonej pętli for strumieniami w języku Java 8?

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

The iteruje pętli listę obiektów „ProvidedService”, a dla każdego z nich, iteruje właściwości listy obiektów "Desk" i wypakowuje pole "Id" do listy.

wymyśliłem następujący kod za pomocą strumieni:

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

czy to właściwa/optymalny sposób to zrobić? Czy istnieje sposób, aby to zrobić bez drugiego zagnieżdżonego strumienia?

+0

myślę, że jest fine.There ma problemu ze swoim podejściu. –

+0

Aby uzyskać więcej informacji, należy kliknąć ten link: http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html –

+0

@Prakhar: Tak, moje podejście zadziałało, ale było naiwne i pomyślałem, że powinien istnieć jakiś sposób na usprawnienie tego, jak wykazano w assyliach. –

Odpowiedz

28

to pewnie napisać to tak:

List<Long> deskIds = service.getAllNodesDepthFirst().stream() 
              .flatMap(p -> p.getDesks().stream()) 
              .map(Desk::getId) 
              .collect(toList()); 
+1

Tak, miałem nadzieję, że było coś takiego jak "flatMap"! –

+0

@assylias Czy jest jakiś łatwy sposób, jeśli chcę uzyskać mapę na końcu zamiast listy, gdzie mapa jest pewnym id ProvidedService, a wartość jest identyfikatorem biurka. – Naman

+0

@Nam można rzucić okiem na grupowanie CollectorBy. – assylias

Powiązane problemy