2016-07-26 42 views
1

考慮下面的映射聲明如何收集地圖鍵值到一個列表

我想用一個單一的數據流,以收集所有的按鍵和所有的值連成一個單一的List<Integer>是通過迭代地圖的條目只是一次。

到目前爲止,我只設法做到這一點,使用兩個單獨的流迭代;一個用於鍵和一個用於值。

它可以一次完成嗎?

+0

鍵 - 值對可作爲一個'設置>''通過地圖:: entrySet'。 'Set'是一個'Collection',所以你可以'流'它,但你也可以簡單地使用'List :: addAll'來將'Set'的內容添加到'List'。 – njzk2

回答

2

試試這個:

List<Integer> numbers = map.entrySet().stream() 
    .flatMap(e -> Stream.of(e.getKey(), e.getValue())) 
    .collect(Collectors.toList()); 
3

Map.entrySet().stream().flatMap(...)應該爲你做。每個Entry都有getKey()getValue(),所以你應該可以在flatMap lambda中將它們組合成2長度的流,然後將它們全部用列表收集器包裝起來。

或者,請使用.entrySet().reduce()來逐個構建列表元素。

+0

我不明白你爲什麼在這裏使用flatMap – njzk2

+0

@ njzk2我的印象是,他想要所有的鍵和所有的值在一個列表中,而不是以某種方式組合它們(如你所描述的那樣)。因此,映射不是一對一的,所以他想要使用flatMap。 –

+0

好的,確實有道理。 – njzk2

0

假設你有一個函數Integer t(K key, V value)

map.entrySet() 
    .stream() 
    .map(entry -> t(entry.key, entry.value)) 
    .collect(Collectors.toList());