这三个是 Java Map 接口中的三个方法,用于对 Map 中的键值对进行操作。它们的区别在于执行的时机和操作的方式:
Map map = new HashMap<>();
map.put("key1", 1);
map.compute("key1", (k, v) -> v + 1); // 现在键 "key1" 对应的值是 2
map.compute("key2", (k, v) -> v + 1); // 因为键 "key2" 不存在,所以v没有值,会报错NullPointerException
Map> map = new HashMap<>();
// 检查键 "key1" 是否存在于 Map 中,如果不存在,则使用 lambda 表达式计算值
map.computeIfAbsent("key1", k -> new ArrayList<>()).add(42);
// 检查键 "key2" 是否存在于 Map 中,如果不存在,则使用 lambda 表达式计算值
map.computeIfAbsent("key2", k -> new ArrayList<>()).add(123);
// 检查键 "key1" 是否存在于 Map 中,由于它已存在,不会执行计算,只会添加到现有的列表中
map.computeIfAbsent("key1", k -> new ArrayList<>()).add(99);
System.out.println(map); // 输出:{key1=[42, 99], key2=[123]}
Map map = new HashMap<>();
map.put("key1", 1);
map.computeIfAbsent("key1", k -> 2); // 不会执行计算函数,键 "key1" 对应的值仍为 1
map.computeIfAbsent("key2", k -> 2); // 键 "key2" 不存在,计算函数返回 2,现在键 "key2" 对应的值是 2
System.out.println(map); // 输出:{key1=1, key2=2}
Map map = new HashMap<>();
map.put("key1", 1);
map.computeIfPresent("key1", (k, v) -> v + 1); // 现在键 "key1" 对应的值是 2
map.computeIfPresent("key2", (k, v) -> v + 1); // 因为键 "key2" 不存在,所以不会进行操作
System.out.println(map); // 输出:{key1=2}
总结:
这些方法允许您对 Map 中的键值对进行灵活的操作,根据需要更新、插入或删除键值对。
getOrDefault(Object key, V defaultValue) 方法是 Java Map 接口的一个方法,用于获取指定键的值,如果该键不存在于 Map 中,则返回一个默认值。该方法的签名如下:
V getOrDefault(Object key, V defaultValue)
Map map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 3);
int countApple = map.getOrDefault("apple", 0); // 返回值为 5,因为 "apple" 存在于 Map 中
int countGrapes = map.getOrDefault("grapes", 0); // 返回值为 0,因为 "grapes" 不存在于 Map 中
总结:
这个方法通常用于避免在获取值之前需要先检查键是否存在的情况,提供了一种简洁的方式来处理这种情况。如果键不存在,它会返回指定的默认值,而不会引发异常。