1. compute、 computeIfAbsent、computeIfPresent
这三个是 Java Map 接口中的三个方法,用于对 Map 中的键值对进行操作。它们的区别在于执行的时机和操作的方式:
compute(K key, BiFunction remappingFunction):
- compute 方法用于计算给定键的新值,该方法接受一个键和一个计算函数 remappingFunction 作为参数。
- 如果 Map 中存在指定的键,则会将键对应的值和计算函数一起传递给 remappingFunction,并用 remappingFunction 返回的结果更新该键的值。
- 如果 Map 中不存在指定的键,则 remappingFunction 不会被调用,方法不会进行任何操作。
Map map = new HashMap<>();map.put("key1", 1);map.compute("key1", (k, v) -> v + 1); // 现在键 "key1" 对应的值是 2map.compute("key2", (k, v) -> v + 1); // 因为键 "key2" 不存在,所以v没有值,会报错NullPointerException
computeIfAbsent(K key, Function mappingFunction):
- computeIfAbsent 方法用于在给定的键在 Map 中不存在时,根据键的映射关系计算一个值并将其插入到 Map 中
- 如果键已经存在于 Map 中,则 computeIfAbsent 方法不会执行计算,而是返回现有的值。
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" 对应的值仍为 1map.computeIfAbsent("key2", k -> 2); // 键 "key2" 不存在,计算函数返回 2,现在键 "key2" 对应的值是 2System.out.println(map); // 输出:{key1=1, key2=2}
computeIfPresent(K key, BiFunction remappingFunction):
- computeIfPresent 方法用于在 Map 中存在指定的键时,根据键的值计算新的值。
- 如果 Map 中不存在指定的键,则不会执行计算函数 remappingFunction,方法不会进行任何操作。
Map map = new HashMap<>();map.put("key1", 1);map.computeIfPresent("key1", (k, v) -> v + 1); // 现在键 "key1" 对应的值是 2map.computeIfPresent("key2", (k, v) -> v + 1); // 因为键 "key2" 不存在,所以不会进行操作System.out.println(map); // 输出:{key1=2}
总结:
- compute 方法无论键是否存在都会执行计算函数。
- computeIfAbsent 方法仅在键不存在时执行计算函数。
- computeIfPresent 方法仅在键存在时执行计算函数。
这些方法允许您对 Map 中的键值对进行灵活的操作,根据需要更新、插入或删除键值对。
2. getOrDefault
getOrDefault(Object key, V defaultValue) 方法是 Java Map 接口的一个方法,用于获取指定键的值,如果该键不存在于 Map 中,则返回一个默认值。该方法的签名如下:
V getOrDefault(Object key, V defaultValue)
- key 是要检索的键。
- 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 中
总结:
这个方法通常用于避免在获取值之前需要先检查键是否存在的情况,提供了一种简洁的方式来处理这种情况。如果键不存在,它会返回指定的默认值,而不会引发异常。
来源地址:https://blog.csdn.net/Crystalqy/article/details/133785390