2014-04-16 108 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