文章目录

这个方法和computeIfAbsent这个都是Java8的新的内容,都是可以在添加map的时候添加一个方法来对key进行操作存储value。

代码:

public V computeIfPresent(K key,
                              BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
    if (remappingFunction == null)
        throw new NullPointerException();
    Node<K,V> e; V oldValue;
    int hash = hash(key);
    if ((e = getNode(hash, key)) != null &&
        (oldValue = e.value) != null) {
        V v = remappingFunction.apply(key, oldValue);
        if (v != null) {
            e.value = v;
            afterNodeAccess(e);
            return v;
        }
        else
            removeNode(hash, key, null, false, true);
    }
    return null;
}

这个方法和上一个方法不同的就是根据key来判断是否进行对value处理存储:

  • 如果map中没有当前这个key就不进行处理
  • 如果有这个key但是value是空的,也不会处理。
  • 如果有这个key并且value不为空,则进行传入的那个方法,在方法处理最后的返回值。
    • 如果返回值为空则删除这个key。
    • 如果不为空那么久进行存储。

进行的相关代码和处理结果:

map中没有此key:

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("k","k");
    map.computeIfPresent("j",(k,v)->genValue1(k,"me"));
    System.out.println("map中没有相关key的时候:"+map);
}
static String genValue1(String k,String v){
    System.out.println(k+v);
    return k+v;
}
结果:
map中没有相关key的时候:{k=k}

map存储了一个相关key,value为null:

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("k","k");
    map.put("j",null);
    map.computeIfPresent("j",(k,v)->genValue1(k,"me"));
    System.out.println("map中有相关key,但是value是null:"+map);
}
static String genValue1(String k,String v){
    System.out.println(k+v);
    return k+v;
}
结果:
map中有相关key,但是value是null:{j=null, k=k}

map存储了一个相关的key,value不为null,但是处理结果为null:

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("k","k");
    map.put("j","m");
    map.computeIfPresent("j",(k,v)->genValue1(k,":key+value"));
    System.out.println("map中有相关key,value不是null,处理结果为null:"+map);
}
static String genValue1(String k,String v){
    System.out.println(k+v);
    return null;
}
结果:
j:key+value
map中有相关key,value不是null,处理结果为null:{k=k}

map存储了一个相关的key,value不为null,处理结果也不为null:

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("k","k");
    map.put("j","m");
    map.computeIfPresent("j",(k,v)->genValue1(k,":key+value"));
    System.out.println("map中有相关key,value不是null,处理结果不为null:"+map);
}
static String genValue1(String k,String v){
    System.out.println(k+v);
    return k+v;
}
结果:
j:key+value
map中有相关key,value不是null,处理结果不为null:{j=j:key+value, k=k}