我有以下情况
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?
答案 0 :(得分:135)
我认为flatMap()
是您正在寻找的。 p>
例如:
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;