当前位置:  开发笔记 > 编程语言 > 正文

使用Java 8流运算符将两个级别映射的列表简化为单个两个级别映射

如何解决《使用Java8流运算符将两个级别映射的列表简化为单个两个级别映射》经验,为你挑选了0个好方法。

我有一个嵌套地图列表(List>>),目标是将列表缩小为一张地图,合并操作如下:如果map1contains x->{y->10, z->20}map2contains x->{y->20, z->20}则应将这两个合并到x->{y->30, z->40}

我尝试按照以下步骤进行操作,并且效果很好。

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.BinaryOperator;
import java.util.stream.Collectors;

public class Test {
    public static void main(String args[]) throws IOException {
        Map> data1 = new HashMap<>();
        Map innerData1 = new HashMap<>();
        innerData1.put("a", 10L);
        innerData1.put("b", 20L);
        data1.put("x", innerData1);
        Map innerData2 = new HashMap<>();
        innerData2.put("b", 20L);
        innerData2.put("a", 10L);
        data1.put("x", innerData1);

        Map> data2 = new HashMap<>();
        data2.put("x", innerData2);

        List>> mapLists = new ArrayList<>();
        mapLists.add(data1);
        mapLists.add(data2);

        Map>  result  = mapLists.stream().flatMap(map -> map.entrySet().stream()).
        collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, new BinaryOperator>() {

            @Override
            public Map apply(Map t,
                    Map u) {
                Map result = t;
                for(Entry entry: u.entrySet()) {
                    Long val = t.getOrDefault(entry.getKey(), 0L);
                    result.put(entry.getKey(), val + entry.getValue());
                }
                return result;
            }
        }));
    }
}

还有其他更好,有效的方法来解决这个问题吗?

如果嵌套级别大于2,如何做得更干净?假设List类似于,List>>>并且我们必须将其简化为单个Map>>,并假设与上述类似的合并功能。

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有