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

本文由黑壳博客转发  

  

本文来源Java中Map的merge、compute、computeIfAbsent、computeIfPresent的用法以及使用场景(一)

一篇一笑

 

 

正文

Java中Map的merge、compute、computeIfAbsent、computeIfPresent的用法以及使用场景(一)
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());  
        }  
    } 

结果: 
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());  
        }  
    }  

 
结果: 
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);  
    }  

结果: 
{女=[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);  
    }  

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

compute,computeIfPresent 下一篇博客。
 

About

欢迎在评论写下你的程序员趣事~~

欢迎加入我们的小组织 ,大家都叫壳叔,期待你的到来。

欢迎关注公众号

 
微信公众号

这是我们的Group

 
黑壳家根据地 Q群:200408242

黑壳博客 blog.bhusk.com

E-mail:keshu@bhusk.com

本文由 黑壳博客的壳叔 创作或转载,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。

可自由转载、引用,但需署名作者且注明文章

留下你的脚步
推荐阅读