2016-07-26 43 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());