2014-11-27 12 views
22

Mentre l'apprendimento di Java 8 corsi d'acqua e Lambas, ho cercato di sostituire il seguente cicli for innestati con i flussi:Qual è il modo corretto di sostituire un ciclo annidato con flussi in Java 8?

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

Le itera un elenco di oggetti 'ProvidedService', e per ciascuno di essi, itera su una proprietà lista di oggetti "Desk" ed estrae il campo "Id" in un elenco.

mi si avvicinò con il seguente codice utilizzando i flussi:

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

È il/modo ottimale corretto di farlo? O c'è un modo per farlo senza il secondo flusso annidato?

+0

Credo che sia fine.There è alcun problema con il vostro approccio. –

+0

Per ulteriori informazioni, visitare questo link: http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html –

+0

@Prakhar: sì, il mio approccio ha funzionato, ma era un po 'ingenuo e ho pensato che ci dovrebbe essere un modo per semplificarlo, come dimostrato dagli assylia. –

risposta

28

avrei probabilmente scrivere in questo modo:

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

Sì, speravo che ci fosse qualcosa come "flatMap"! –

+0

@assylias C'è un modo semplice se voglio ottenere una mappa alla fine invece di una lista, dove la mappa è un id di ProvidedService e il valore è desk id. – Naman

+0

@Naman puoi dare un'occhiata al raggruppamento su Raccoglitore. – assylias

Problemi correlati