Map中的put、putIfAbsent、compute、computeIfAbsent、computeIfPresent使用方法

1、概述

        Map是做软件开发中使用频率最高的数据结构之一。它的最大特点是能够快速地进行查找和更改数据,经常被用做缓存以及数据重复检查场景中。很多人在给Map赋值过程中只知道最基础的put方法,下面我将给大家详细介绍下其他赋值方法的区别。

2、内容

       

put:【添加】

key不存在,直接添加,put方法返回null;

key存在,新值覆盖旧值,put方法返回旧值。

public static void main(String[] args) {
    Map map = new HashMap<>();
    System.out.println("1->"+map.put(1, "a"));
    System.out.println("2->"+map.put(2, "b"));
    System.out.println("3->"+map.put(2, "c"));
    System.out.println("4->"+map);
    //控制台输出:
//    1->null
//    2->null
//    3->b
//    4->{1=a, 2=c}
}

putIfAbsent:【不存在则添加】

key不存在,直接添加,putIfAbsent方法返回null;

key存在,不进行操作,putIfAbsent方法返回旧值。

public static void main(String[] args) {
    Map map = new HashMap<>();
    System.out.println("1->"+map.putIfAbsent(1, "a"));
    System.out.println("2->"+map.putIfAbsent(2, "b"));
    System.out.println("3->"+map.putIfAbsent(2, "c"));
    System.out.println("4->"+map);
    //控制台输出:
//    1->null
//    2->null
//    3->b
//    4->{1=a, 2=b}
}

compute:【计算】

计算后结果为null,删除当前key,compute方法返回null;

计算后结果不为null,分为以下两种情况:

        key不存在,直接添加,compute方法返回新值;

        key存在,新值覆盖旧值,compute方法返回新值。

public static void main(String[] args) {
    Map map = new HashMap<>();
    System.out.println("1->"+map.compute(1, (k, v) ->  k + "a"));
    System.out.println("1->"+map);
    System.out.println("2->"+map.compute(1, (k, v) ->  k + "b"));
    System.out.println("2->"+map);
    System.out.println("3->"+map.compute(1, (k, v) -> null));
    System.out.println("3->"+map);
    System.out.println("4->"+map.compute(2, (k, v) ->  null));
    System.out.println("4->"+map);
    //控制台输出:
//    1->1a
//    1->{1=1a}
//    2->1b
//    2->{1=1b}
//    3->null
//    3->{}
//    4->null
//    4->{}
}

computeIfAbsent:【不存在则计算】

key不存在,直接添加,computeIfAbsent方法返回新值;

key存在,不进行操作,computeIfAbsent方法返回旧值;

计算为null,不进行操作,key存在时computeIfAbsent返回旧值,不存在时返回null。

使用场景:

map值为列表时,如果是个不存在的key,则需要先初始化一个列表;如果是个存在的key,则从map中取到此列表。最后给列表添加元素,再把列表放入到map中。

如果用computeIfAbsent,则可以直接获取list而不需要判断key存不存在。

Map> map = new HashMap<>();
List list=map.computeIfAbsent(mapKey, k -> new ArrayList<>());
list.add("a");
map.put(mapKey,list);
public static void main(String[] args) {
    Map map = new HashMap<>();
    System.out.println("1->"+map.computeIfAbsent(1, k ->  k + "a"));
    System.out.println("1->"+map);
    System.out.println("2->"+map.computeIfAbsent(1, k ->  k + "b"));
    System.out.println("2->"+map);
    System.out.println("3->"+map.computeIfAbsent(1, k -> null));
    System.out.println("3->"+map);
    System.out.println("4->"+map.computeIfAbsent(2, k ->  null));
    System.out.println("4->"+map);
    //控制台输出:
//    1->1a
//    1->{1=1a}
//    2->1a
//    2->{1=1a}
//    3->1a
//    3->{1=1a}
//    4->null
//    4->{1=1a}
}

computeIfPresent:【存在则计算】

计算后结果为null,删除当前key,compute方法返回null;

计算后结果不为null,分为以下两种情况:

        key不存在,不进行操作,computeIfPresent方法返回null;

        key存在,新值覆盖旧值,computeIfPresent方法返回新值;

public static void main(String[] args) {
    Map map = new HashMap<>();
    System.out.println("1->"+map.computeIfPresent(1, (k, v) ->  k + "a"));
    System.out.println("1->"+map);
    map.put(1,"A");
    System.out.println("2->"+map.computeIfPresent(1, (k, v) ->  k + "b"));
    System.out.println("2->"+map);
    System.out.println("3->"+map.computeIfPresent(1, (k, v) -> null));
    System.out.println("3->"+map);
    System.out.println("4->"+map.computeIfPresent(2, (k, v) -> null));
    System.out.println("4->"+map);
    //控制台输出:
//    1->null
//    1->{}
//    2->1b
//    2->{1=1b}
//    3->null
//    3->{}
//    4->null
//    4->{}
}

你可能感兴趣的:(JAVA,java)