2015-07-15 59 views
5

Załóżmy, że mam klasę zawierającą listę, np.Co to jest odpowiednik java 8 dla transformAndConcat Guava?

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

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

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

Chodźmy ponadto zakładać Mam całą listę wystąpień tej klasy:

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); 

I teraz muszę ekstraktu wszystkie ciągi aby uzyskać listę ciąg zawierający wszystkie ciągi wszystkich instancje, np .:

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

Z Guava miałoby to wyglądać tak:

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

Moje pytanie brzmi jak mogę osiągnąć to samo z Java 8 strumienia API?

Odpowiedz

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

Oto starsza pytanie o zbiórki spłaszczenie: (Flattening a collection)

+6

lub '.map (ListHolder :: getlist) .flatMap (Lista :: stream)' – assylias

Powiązane problemy