2015-07-15 7 views
5

Supponiamo di avere una classe contenente un elenco, ad es.Qual è l'equivalente di java 8 per la trasformazione di AnimAndConcat?

public static class ListHolder { 
    List<String> list = new ArrayList<>(); 

    public ListHolder(final List<String> list) { 
     this.list = list; 
    } 

    public List<String> getList() { 
     return list; 
    } 
} 

Diamo inoltre assumere Ho un intero elenco di istanze di questa classe:

ListHolder listHolder1 = new ListHolder(Arrays.asList("String 1", "String 2")); 
    ListHolder listHolder2 = new ListHolder(Arrays.asList("String 3", "String 4")); 
    List<ListHolder> holders = Arrays.asList(listHolder1, listHolder2); 

E ora ho bisogno di estratto di tutte le stringhe per ottenere un elenco di stringhe contenente tutte le stringhe di tutti casi, ad esempio:

[String 1, String 2, String 3, String 4] 

Con Guava questo sarebbe simile a questa:

 List<String> allString = FluentIterable 
      .from(holders) 
      .transformAndConcat(
        new Function<ListHolder, List<String>>() { 
         @Override 
         public List<String> apply(final ListHolder listHolder) { 
          return listHolder.getList(); 
         } 
        } 
      ).toList(); 

La mia domanda è come posso ottenere lo stesso con il Java 8 flusso di API?

risposta

13
List<String> allString = holders.stream() 
    .flatMap(h -> h.getList().stream()) 
    .collect(Collectors.toList()); 

Qui è una questione più vecchio sulla raccolta appiattimento: (Flattening a collection)

+6

o '.map (ListHolder :: getList) .flatMap (Lista :: stream)' – assylias

Problemi correlati