2014-04-16 66 views
28

我有以下的情况的Java 8:合并列表与流API

Map<Key, ListContainer> map; 

public class ListContainer{ 
    List<AClass> lst; 
} 

我不得不从ListContainer对象lst合并所有列表从Map地图。

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

任何想法如何使用Java 8流API?

+0

你能提供你的意思是什么合并的例子吗?假设你的地图是'{a:[1,2],b [3,4]}',你想链接它们吗?比如'[1,2,3,4]',或者列出一个列表, '[[1,2],[3,4]]'或者压缩它们[[1,3],[2,4]]'?此外,你知道一个地图没有秩序,是吗? –

+0

@tobias_k我希望结果是'[1,2,3,4]',未排序! –

+0

如果'ListContainer'只包装一个'List ',那么你可以用'Map >'替换'Map ' – ThePyroEagle

回答

82

我认为flatMap()是你在找什么。

例如:

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

请注意,flatmap可以简单地为'.flatMap(Collection :: stream)' – Jean

+1

?为什么删除的注释解释了为什么'.flatMap(Collection :: stream)'在这里是不可能的? – Puce

+0

@Parse很好的问题,但是它是可能的:如果'ListContainer'被封装(即有'lst'的getter),你可以将'.flatMap( - >)'分解成'.map(ListContainer :: getLst )''.flatMap(Collection :: stream)' – TWiStErRob

22

备选:Stream.concat()

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

加1即使它不回答问题,它回答问题的标题 –

+0

正是我在找的东西!谢谢! – Hans