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 下一篇博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章