Java 8:使用流API合并列表


80

我有以下情况

Map<Key, ListContainer> map; 

public class ListContainer{
  List<AClass> lst;
}

我必须合并所有列表 lstListContainer从对象Map地图。

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

知道如何使用Java 8流API吗?


您能否提供一个示例,说明合并的含义?假设您的地图是{a: [1,2], b[3,4]},您是要像那样将它们链接起来[1,2,3,4],还是要列出列表[[1,2],[3,4]],还是要压缩它们[[1,3],[2,4]]?另外,您知道地图没有顺序,对吗?
tobias_k 2014年

@tobias_k我希望结果是[1,2,3,4],未排序!
mat_boy 2014年

如果ListContainer只包装一个,List<T>则可以替换Map<Key, ListContainer>Map<Key, List<T>>
ThePyroEagle

Answers:


166

我认为 flatMap()这就是您要寻找的。

例如:

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

2
?为什么在.flatMap(Collection::stream)这里删除了无法解释的评论 ?
深褐色

@Puce很好的问题,但是这是可能的:如果ListContainer被封装(即具有的getter lst),则可以分解.flatMap(->).map(ListContainer::getLst) .flatMap(Collection::stream)
TWiStErRob,2016年

3
@TWiStErRob是的,这就是我在原始评论中写的内容。为什么将其删除?
培斯(Puce)2013年

.flatMap(Collection::stream)我认为,@ Puce在您的答案中注释一个解释为什么不可能的更好。应该更永久。
SQB

1
@Alex是的,这是一种方式。.map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
Puce

54

备选:Stream.concat()

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

1
加上1,即使它没有回答问题,也回答了问题的标题
Tony BenBrahim

2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.