2015-07-15 9 views
5

Предположим, у меня есть класс , содержащий Список, например.Что такое java 8, эквивалентный преобразованию Guava'sAndConcat?

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

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

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

Давайте, кроме того, предположим, у меня есть весь список экземпляров этого класса:

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

А теперь мне нужно экстракте все строки, чтобы получить список строк, содержащий все строки из всех случаи, например:

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

С гуавы это будет выглядеть так:

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

Мой вопрос как я могу добиться того же с Java 8 потока API?

ответ

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

Вот старше вопрос о коллекции уплощение: (Flattening a collection)

+6

или '.map (ListHolder :: GetList) .flatMap (Список :: поток)' – assylias

Смежные вопросы