Java流:将Map <枚举,列表<a =“” >>到列表<b>

时间:2019-02-11 14:32:52

标签: java java-stream

我想使用Java流执行以下操作:

我有一个Map<Enum, List<A>>,我想将其转换为List<B>具有B属性的Enum, A

因此,对于每个键和该键列表中的每个项目,我都需要制作一个B项并将它们全部收集到List<B>中。

如何使用Java流完成它?

谢谢!

3 个答案:

答案 0 :(得分:6)

您可以flatMap B个地图条目。

List<B> bList = map.entrySet().stream()
    // a B(key, value) for each of the items in the list in the entry
   .flatMap(e -> e.getValue().stream().map(a -> new B(e.getKey(), a)))
   .collect(toList());

答案 1 :(得分:2)

为了这个示例,我将把B称为Pair<Enum, A>。您可以使用#flatMap和嵌套流来完成它:

List<Pair<Enum, A>> myList =
    //Stream<Entry<Enum, List<A>>>
    myMap.entrySet().stream()
    //Stream<Pair<Enum, A>>
    .flatMap(ent -> 
        //returns a Stream<Pair<Enum, A>> for exactly one entry
        ent.getValue().stream().map(a -> new Pair<>(ent.getKey(), a)))
    .collect(Collectors.toList()); //collect into a list

简而言之,您可以利用Map#entrySet来检索可以流式传输的地图条目的集合。 #flatMap将为流中的每个元素获取流的返回值,并将其组合。

答案 2 :(得分:1)

一个简单的forEach解决方案是:

List<B> bList = new ArrayList<>();
map.forEach((key, value) -> value.forEach(val -> bList.add(new B(key, val))));