在Java的Map中,getOrDefault方法是一个非常有用的方法,如果键不存在于Map中,则返回默认值而不是null。本文通过深入探讨该方法的实现和使用,向读者展示其强大的功能和灵活性。
一、getOrDefault 方法的语法和基础用法
getOrDefault 方法的基础用法非常简单,下面是它的语法:
V getOrDefault(Object key, V defaultValue)
其中,key 代表 Map 中要查找的键,defaultValue 是当键不存在于 Map 中时返回的默认值。事实上,如果键 key 存在于 Map 中,getOrDefault 将返回与其关联的值,否则将返回 defaultValue。
下面是一个基本的示例:
Mapmap = new HashMap<>(); map.put("A", 1); map.put("B", 2); int value1 = map.getOrDefault("A", 0);//返回1 int value2 = map.getOrDefault("C", 0);//返回0
在以上示例中,对于 map.getOrDefault("A", 0) 调用,由于键 "A" 存在于 Map 中,该方法将返回 1。而对于 map.getOrDefault("C", 0) 调用,由于搜寻键 "C" 找不到,所以将返回默认值 0。
二、getOrDefault 方法的实现原理
接下来,我们将讨论 getOrDefault 方法实现的内部机制。事实上,在 HashMap 和 ConcurrentHashMap 等常用的 Java Map 实现中,getOrDefault 方法的实现与 get 方法基本相同。
在 HashMap 中,getOrDefault 方法的实现如下:
public V getOrDefault(Object key, V defaultValue) { Nodee; return (e = getNode(hash(key), key)) == null ? defaultValue : e.value; }
在以上代码中,getNode 是 HashMap 中一个私有方法,它用于在 HashMap 中查找给定键的节点。如果该节点存在,则将其与 defaultValue 进行比较,否则将返回 defaultValue。
同样地,在 ConcurrentHashMap 中,getOrDefault 方法的实现也类似:
public V getOrDefault(Object key, V defaultValue) { V v; return (v = get(key)) == null ? defaultValue : v; }
事实上,ConcurrentHashMap 的 getOrDefault 方法完全依靠 get 方法的实现,只是在实现中添加了 defaultValue 的逻辑。
三、getOrDefault 方法的高级用法
除了基本的用法外,getOrDefault 方法还提供了一些高级用法,下面是其中的一些示例。
示例1:使用 Lambda 表达式设置默认值
在Java 8 中,使用 Lambda 表达式可以轻松地将默认值与函数的返回值相结合,从而实现一些更为复杂的任务。
Map> listMap = new HashMap<>(); List value = listMap.getOrDefault("key", new ArrayList<>(), List::isEmpty);//返回true
在以上示例中,我们使用了一个 Lambda 表达式,它检查了 listMap 中 "key" 的值是否为空。该表达式将在返回默认值时使用,并且只有在值为空时才会返回。
示例2:结合 putIfAbsent 方法使用
putIfAbsent 是 Map 接口中的另一个非常实用的方法。它实现了一种常见的任务:在给定的键不存在于 Map 中时,将其与给定的值关联,否则,返回已经与该键相关联的当前值。
与此一致,在一些具有特定需求的情况下,我们希望检查某个键是否存在,如果存在,返回相关的值,如果不存在,则将一个新值放置在其中。
Mapmap = new HashMap<>(); int defaultValue = 0; String key = "key"; int existingValue = map.putIfAbsent(key, defaultValue); if (existingValue != null) { // 键在Map中已经存在 return existingValue; } // 键在Map中不存在,那就使用defaultValue并放置一个新值 return defaultValue;
示例3:获取某个键的值时同时更新该项
在一些特定情境下,我们希望获取某个键的值,并且在确定的情况下对其进行更新。这时,我们可以利用 getOrDefault 的 Value 参数来源于代码块的特性。
Map> map = new HashMap<>(); String key = "key"; List newList = new ArrayList<>(); List existingList = map.getOrDefault(key, new ArrayList<>()); if (!existingList.isEmpty()) { // 键在Map中已经存在 map.put(key, existingList); } else { // 键在Map中不存在 map.put(key, newList); }
在以上示例中,我们使用 getOrDefault 方法来检查键 key 是否存在。如果键已经存在于 Map 中,则 put 方法的操作将更新其值。如果不存在,则默认值将被设置为新的 List 对象。
结语
本文深入讨论了 Map 的 getOrDefault 方法:它的语法和基础用法,它的实现原理,以及一些高级用法。
对于熟练地使用 Java Map 的开发人员来说,getOrDefault 方法已经成为他们编写更灵活和高效代码的有力武器。然而,即使是这些开发人员,也应该通过不断地学习和尝试来更好地利用它的潜力。