美文网首页java8的世界Java-解读
map的merge和computeIfAbsent来简化你的代码

map的merge和computeIfAbsent来简化你的代码

作者: 可爱猪猪 | 来源:发表于2019-07-31 13:44 被阅读3次

    作者:可爱猪猪 - 帅锅一枚
    作者的网名很阔爱,如果喜欢本文章一定要点 喜欢 或者 打赏,拜托~
    作者一直在进步,需要你们的支持和鼓励,谢谢!
    人生理想:在程序猿界混出点名堂!

    JAVA8在map新增了方法merge和computeIfAbsent,直接通过例子来看一下如何使用?

    1.merge

    需求场景:有一个学生的集合,按班级统计学生的成绩总和。
    a.老的写法

    public static Map<String, Integer> mergeOld() {
            List<Student> students = Lists.newArrayList();
            students.add(new Student("张三", "一年级一班", 70));
            students.add(new Student("李四", "一年级一班", 70));
            students.add(new Student("王五", "一年级二班", 80));
            Map<String, Integer> map = new HashMap<String, Integer>();
    
            students.forEach(s -> {
                String clazz = s.getClazz();
                Integer score = s.getScore();
                Integer summary;
                if ((summary = map.get(clazz)) != null) {
                    map.put(clazz, summary + score);
                } else {
                    map.put(clazz, score);
                }
            });
            return map;
        }
    

    b.新的写法

    public static Map<String, Integer> mergeNew() {
            List<Student> students = Lists.newArrayList();
            students.add(new Student("张三", "一年级一班", 70));
            students.add(new Student("李四", "一年级一班", 70));
            students.add(new Student("王五", "一年级二班", 80));
            Map<String, Integer> map = new HashMap<String, Integer>();
    
            students.forEach(s -> map.merge(s.getClazz(), s.getScore(), (ov, nv) -> ov + nv));
            return map;
        }
    

    merge是对同一个key的新value和旧value的一个合并,合并规则自己实现,
    该方法第一个参数当然为key,第二个参数是新value,第三个参数是计算规则。
    如果key对应的旧value为空,则value是新value,如果key对应的就value不为空,则value为计算的value。
    一句话实现以上逻辑是不是很简单。。

    2.computeIfAbsent

    需求场景:有一个学生的集合,按班级统计学生的成绩的分布。
    a.老的写法

    public static Map<String, List<Integer>> computeIfAbsentOld() {
            List<Student> students = Lists.newArrayList();
            students.add(new Student("张三", "一年级一班", 70));
            students.add(new Student("李四", "一年级一班", 70));
            students.add(new Student("王五", "一年级二班", 80));
            Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
            students.forEach(s -> {
                String clazz = s.getClazz();
                Integer score = s.getScore();
                List<Integer> scores;
                if ((scores = map.get(clazz)) == null) {
                    map.put(clazz, Lists.newArrayList(score));
                } else {
                    scores.add(score);
                }
            });
            return map;
        }
    

    b.新的写法

    public static Map<String, List<Integer>> computeIfAbsentNew() {
            List<Student> students = Lists.newArrayList();
            students.add(new Student("张三", "一年级一班", 70));
            students.add(new Student("李四", "一年级一班", 70));
            students.add(new Student("王五", "一年级二班", 80));
            Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
            
            
            students.forEach(s -> map.computeIfAbsent(s.getClazz(), (k)->Lists.newArrayList()).add(s.getScore()));
            return map;
        }
    
    

    computeIfAbsent第一个参数为key,第二个参数为value
    当key对应的value为空时,才设置value
    关键在于返回值如果key对应的value为空,则返回新put的value,如果key对应的value不为空,则返回旧value

    赶快试试吧!

    相关文章

      网友评论

        本文标题:map的merge和computeIfAbsent来简化你的代码

        本文链接:https://www.haomeiwen.com/subject/cuwzrctx.html