Java中Map的merge、compute、computeIfAbsent、computeIfPresent的用法以及使用场景


转自: https://blog.csdn.net/mengxb12138/article/details/80893937

merge,computeIfAbsent使用场景

merge的用法

merge :default V merge(K key, V value,BiFunction《? super V, ? super V, ? extends V> remappingFunction)

merge 的方法有三个参数 第一个是所选map的key,第二个是需要合并的值,第三个是 如何合并,也就是说合并方法的具体实现。

之前的实现

现在我们要做一个操作,把list中的对象,按照属性男女分组,然后把年龄汇总。如果是1.8之前的实现。

    /**
     * @author xbmeng
     */
    public static void main(String[] args) {

        //学生的集合
        List<Student> students = new ArrayList<>();
        students.add(new Student("张三","男",18));
        students.add(new Student("李四","男",20));
        students.add(new Student("韩梅梅","女",18));
        students.add(new Student("小红","女",45));

        //声明接收结果的 map
        Map<String, Integer> resultMap = new HashMap<>();
        for (Student student : students) {
            Integer age = resultMap.get(student.getSex());
            if(age != null){
                resultMap.put(student.getSex(),student.getAge()+age);
            }else {
                resultMap.put(student.getSex(),student.getAge());
            }
        }
        printResult(resultMap);

    }


    private static void printResult(Map<String, Integer> map){
        for (Map.Entry<String, Integer> e : map.entrySet()) {
            System.out.println("key:"+e.getKey()+"   "+"value:"+e.getValue());
        }
    }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

结果:
key:女 value:63
key:男 value:38

1.8中的实现

现在我们要做一个操作,把list中的对象,按照属性男女分组,然后把年龄汇总。如果是1.8之前的实现。

  /**
     * @author xbmeng
     */
    public static void main(String[] args) {

        //学生的集合
        List<Student> students = new ArrayList<>();
        students.add(new Student("张三","男",18));
        students.add(new Student("李四","男",20));
        students.add(new Student("韩梅梅","女",18));
        students.add(new Student("小红","女",45));

        //声明接收结果的 map
        Map<String, Integer> resultMap = new HashMap<>();
        for (Student student : students) {
            resultMap.merge(student.getSex(), student.getAge(), (a, b) -> b + a);
        }
        printResult(resultMap);

    }


    private static void printResult(Map<String, Integer> map){
        for (Map.Entry<String, Integer> e : map.entrySet()) {
            System.out.println("key:"+e.getKey()+"   "+"value:"+e.getValue());
        }
    }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

结果:
key:女 value:63
key:男 value:38

computeIfAbsent的用法,map缓冲区

merge :computeIfAbsent(K key,
Function《? super K, ? extends V> mappingFunction)

merge 的方法有两个参数 第一个是所选map的key,第二个是需要做的操作。这个方法当key值不存在时才起作用。

之前的实现

情景:按照男女分组。

    /**
     * @author xbmeng
     */
    public static void main(String[] args) {

        //学生的集合

        List<Student> students = new ArrayList<>();
        students.add(new Student("张三","男",18));
        students.add(new Student("李四","男",20));
        students.add(new Student("韩梅梅","女",18));
        students.add(new Student("小红","女",45));

        //声明接收结果的 map
        Map<String, List<Student>> resultMap = new HashMap<>();
        for (Student student : students) {
            List<Student> s = resultMap.get(student.getSex());
            if(null == s){
                s = new ArrayList<>();
                resultMap.put(student.getSex(),s);
            }
            s.add(student);
        }

        System.out.println(resultMap);
    }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

结果:
{女=[Student{name=’韩梅梅’, sex=’女’, age=18}, Student{name=’小红’, sex=’女’, age=45}], 男=[Student{name=’张三’, sex=’男’, age=18}, Student{name=’李四’, sex=’男’, age=20}]}

1.8中的实现

情景:按照男女分组。

   /**
     * @author xbmeng
     */
    public static void main(String[] args) {

        //学生的集合

        List<Student> students = new ArrayList<>();
        students.add(new Student("张三","男",18));
        students.add(new Student("李四","男",20));
        students.add(new Student("韩梅梅","女",18));
        students.add(new Student("小红","女",45));

        //声明接收结果的 map
        Map<String, List<Student>> resultMap = new HashMap<>();
        for (Student student : students) {
            List<Student> s = resultMap.computeIfAbsent(student.getSex(), k -> new ArrayList<>());
            s.add(student);
        }

        System.out.println(resultMap);
    }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

结果:
{女=[Student{name=’韩梅梅’, sex=’女’, age=18}, Student{name=’小红’, sex=’女’, age=45}], 男=[Student{name=’张三’, sex=’男’, age=18}, Student{name=’李四’, sex=’男’, age=20}]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值