Java 8:使用流API合并列表

时间:2014-04-16 14:49:02

标签: java list java-8 java-stream

我有以下情况

Map<Key, ListContainer> map; 

public class ListContainer{
  List<AClass> lst;
}

我必须合并lst地图中ListContainer个对象的所有列表Map

public static void main(String args[]){
   List<AClass> alltheObjectsAClass = map.values().stream(). // continue....    
}

有没有想过如何使用Java 8流API?

5 个答案:

答案 0 :(得分:135)

我认为flatMap()是您正在寻找的。

例如:

 List<AClass> allTheObjects = map.values()
         .stream()
         .flatMap(listContainer -> listContainer.lst.stream())
         .collect(Collectors.toList());

答案 1 :(得分:41)

替代方案:Stream.concat()

Stream.concat(map.values().stream(), listContainer.lst.stream())
                             .collect(Collectors.toList()

答案 2 :(得分:3)

上面已经回答了,但您可以采用另一种方法。我找不到我改编的原始帖子,但为了您的问题,这里是代码。如上所述,flatMap() 函数是您希望在 Java 8 中使用的函数。您可以将其放入实用程序类中,然后调用“RandomUtils.combine(list1, list2, ...);”你会得到一个包含所有值的列表。请注意通配符 - 如果您想要一个不太通用的方法,您可以更改它。您还可以针对 Sets 修改它 - 您只需要在 Sets 上使用 flatMap() 时小心,以避免由于 Set 接口的性质而从 equals/hashCode 方法中丢失数据。

编辑 - 如果您对 Set 接口使用这样的通用方法,并且您碰巧使用 Lombok,请确保您了解 Lombok 如何处理 equals/hashCode 生成。

  /**
    * Combines multiple lists into a single list containing all elements of
    * every list.
    * 
    * @param <T> - The type of the lists.
    * @param lists - The group of List implementations to combine
    * @return a single List<?> containing all elements of the passed in lists.
    */
   public static <T> List<?> combine(final List<?>... lists) {
      return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList());
   }

答案 3 :(得分:2)

在Java 8中,我们可以使用流List1.stream()。collect(Collectors.toList())。addAll(List2);另一个选项List1.addAll(List2)

答案 4 :(得分:1)

要将多个列表或其他类型的集合合并为一个,您可以使用以下方法:


            var pulledColorScheme = document.Theme.ColorScheme;