使用流 API 合并列表

我有以下情况

Map<Key, ListContainer> map;


public class ListContainer {
List<AClass> lst;
}

我必须合并来自 Map映射的 ListContainer对象的所有列表 lst

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

知道如何使用 Java8流 API 吗?

150397 次浏览

I think flatMap() is what you're looking for.

For example:

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

Alternative: Stream.concat()

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

In Java 8 we can use stream List1.stream().collect(Collectors.toList()).addAll(List2); Another option List1.addAll(List2)

Already answered above, but here's another approach you could take. I can't find the original post I adapted this from, but here's the code for the sake of your question. As noted above, the flatMap() function is what you'd be looking to utilize with Java 8. You can throw it in a utility class and just call "RandomUtils.combine(list1, list2, ...);" and you'd get a single List with all values. Just be careful with the wildcard - you could change this if you want a less generic method. You can also modify it for Sets - you just have to take care when using flatMap() on Sets to avoid data loss from equals/hashCode methods due to the nature of the Set interface.

Edit - If you use a generic method like this for the Set interface, and you happen to use Lombok, make sure you understand how Lombok handles equals/hashCode generation.

  /**
* 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());
}

To merge several lists or other types of collections into a single one you can use this approach:

Stream.of(list1.stream(), list2.stream(), someSet.stream(), otherCollection.stream())
.flatMap(Function.identity())
.collect(Collectors.toList());