HashMap中merge方法用法-优雅

merge简介
merge() 可以这么理解:它将新的值赋值到 key (如果不存在)或更新给定的key 值对应的 value

1、merge源码

merge() 可以这么理解:它将新的值赋值到 key (如果不存在)或更新给定的key 值对应的 value

default V merge(K key, V value,
        BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    //判断value和remappingFunction都不为空        
    Objects.requireNonNull(remappingFunction);
    Objects.requireNonNull(value);
    //通过key去获取旧值 若无这个key则null
    V oldValue = get(key);
    //新值 = 旧值为null则新值=null,旧值不为null则新值=  remappingFunction.apply(旧值, 新值);
    V newValue = (oldValue == null) ? value :
               remappingFunction.apply(oldValue, value);
    //判断新值为null的话           
    if(newValue == null) {
        //移除这个key
        remove(key);
    } else {
        //不为null的话,重新put
        put(key, newValue);
    }
    return newValue;
}

我们可以看到原理也是很简单的,该方法接收三个参数,一个 key 值,一个 value,一个 remappingFunction ,如果给定的key不存在,它就变成了 put(key, value) 。
但是,如果 key 已经存在一些值,我们 remappingFunction 可以选择合并的方式,然后将合并得到的 newValue 赋值给原先的 key。

2、merge使用

假设有一段业务逻辑,有个学生类,包含学生的姓名、科目、成绩三个属性,需要查看学生的总成绩

pubilc class Student{
    private String name;
    private String suject;
    private Integer score;

    public Student(String name, String suject, Integer score) {
        this.name = name;
        this.suject = suject;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSuject() {
        return suject;
    }

    public void setSuject(String suject) {
        this.suject = suject;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }
}

我们来写一个方法定义学生

public class Demo {
    public static ArrayList<Student> reStrudents(){
        ArrayList<Student> students = new ArrayList();

        Student student1 = new Student("王麻子", "数学", 29);
        Student student2 = new Student("黑蛋", "数学", 43);
        Student student3 = new Student("大全", "数学", 56);
        Student student4 = new Student("二雷子", "数学", 22);
        Student student5 = new Student("王麻子", "语文", 76);
        Student student6 = new Student("黑蛋", "语文", 54);
        Student student7 = new Student("大全", "语文", 56);
        Student student8 = new Student("二雷子", "语文", 67);
        Student student9 = new Student("王麻子", "英语", 102);
        Student student10 = new Student("黑蛋", "英语", 23);
        Student student11 = new Student("大全", "英语", 43);
        Student student12 = new Student("二雷子", "英语", 23);
        students.add(student1);
        students.add(student2);
        students.add(student3);
        students.add(student4);
        students.add(student5);
        students.add(student6);
        students.add(student7);
        students.add(student8);
        students.add(student9);
        students.add(student10);
        students.add(student11);
        students.add(student12);
        return students;
    }
}

我们来写业务逻辑
非使用merger方法

public static void main(String[] args) {
    ArrayList<Student> students = reStrudents();
    HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();

    students.forEach(student -> {
        if (stringIntegerHashMap.containsKey(student.getName())){
            stringIntegerHashMap.put(student.getName(),
                    stringIntegerHashMap.get(student.getName())+student.getScore());
        }else {
            stringIntegerHashMap.put(student.getName(),student.getScore());
        }});

    System.out.println(stringIntegerHashMap.toString());
}

使用merge方法

public static void main(String[] args) {
    ArrayList<Student> students = reStrudents();
    HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();
    
    students.forEach(student ->
            stringIntegerHashMap.merge(
                    student.getName(),
                    student.getScore(),
                    Integer::sum
            ));
            
    System.out.println(stringIntegerHashMap.toString());
}

使用场景
这个使用场景相对来说还是比较多的,比如分组求和这类的操作,虽然 stream 中有相关 groupingBy() 方法,但如果你想在循环中做一些其他操作的时候,merge() 还是一个挺不错的选择的。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值