HashMap中的compute、computeIfAbsent、computeIfPresent
文章目录
1、compute
1)查看compute方法的文档:
根据指定的key和它对应的value,计算一个新的映射(如果没有当前映射,则value为null)。
2)查看BigFunction接口的文档:
表示一个接受两个参数并产生结果的函数接口。
3)分析
compute方法可以根据指定key值,找到map中对应的键值对,进行一番计算后,返回新value。如果新value不为null,且key值在map中本就存在,则新value替换对应旧value;如果key值在map中原本就不存在,则新的映射建立。如果新value为null,将删除旧的映射。
4)测试
控制台打印结果为11
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.put(1, 10);
hashMap.compute(1, (key, value) -> {
if (value == null) {
value = 0;
}
return key + value;
});
log.info(hashMap.get(1).toString());
}
}
控制台打印结果为10和4
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.put(1, 10);
hashMap.compute(4, (key, value) -> {
if (value == null) {
value = 0;
}
return key + value;
});
log.info(hashMap.get(1).toString());
log.info(hashMap.get(4).toString());
}
}
控制台打印结果为false
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.compute(4, (key, value) -> {
if (value == null) {
value = 0;
}
return null;
});
log.info(String.valueOf(hashMap.containsKey(4)));
}
}
控制台打印结果为false
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.put(1, 10);
hashMap.compute(1, (key, value) -> {
if (value == null) {
value = 0;
}
return null;
});
log.info(String.valueOf(hashMap.containsKey(1)));
}
}
注意,如果value在lambda函数中参与了计算,那么对value进行判空是很有必要的,因为如果指定的key在map中不存在,那么参与计算的value将是null。
2、computeIfAbsent
1)分析
如果指定key不存在或关联值为null,就把函数接口返回的值作为指定key的value(除非返回值为null)
2)测试
控制台打印结果为10
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.put(1, 10);
hashMap.computeIfAbsent(1, k -> 20);
log.info(hashMap.get(1).toString());
}
}
控制台打印结果为20
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.computeIfAbsent(1,k->20);
log.info(hashMap.get(1).toString());
}
}
控制台打印结果为20
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.put(1, null);
hashMap.computeIfAbsent(1,k->20);
log.info(hashMap.get(1).toString());
}
}
控制台打印结果为false
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.computeIfAbsent(1,k->null);
log.info(String.valueOf(hashMap.containsKey(1)));
}
}
3、computeIfPresent
1)分析
如果指定key对应的value存在且不是null,就将函数接口的返回值和key建立联系。
2)测试
控制台打印结果为20
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.put(1, 10);
hashMap.computeIfPresent(1,(k,v)->20);
log.info(hashMap.get(1).toString());
}
}
控制台打印结果为false
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.computeIfPresent(1,(k,v)->20);
log.info(String.valueOf(hashMap.containsKey(1)));
}
}
控制台打印结果为true
@Slf4j
public class Main {
public static void main(String[] args) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.put(1, null);
hashMap.computeIfPresent(1,(k,v)->20);
log.info(String.valueOf(hashMap.get(1) == null));
}
}