使用示例在Java中的HashMap computeIfAbsent()方法
在Java中,HashMap是大家非常常见的数据结构之一。它允许我们存储键值对,并且可以通过键快速访问对应的值。HashMap的实现基于哈希表,在访问数据时具有O(1)的平均时间复杂度。这种设计使得HashMap成为处理大量数据非常高效的数据结构之一。
在本文中,我们将学习HashMap的一个非常实用的方法,即computeIfAbsent()方法。我们将介绍它的基本用法及示例代码,以及它的一些高级特性。
HashMap computeIfAbsent()方法基础用法
在学习computeIfAbsent()方法之前,我们先看一下HashMap的基本用法。HashMap的基本操作包括put()、get()和remove()三个方法。put()用于向HashMap中添加元素,get()用于获取指定键对应的值,remove()用于删除指定键及其对应的值。
接下来,我们来看一下computeIfAbsent()方法。它的作用是根据指定的键从HashMap中获取对应的值。如果这个键不存在,则会使用指定的计算函数计算一个新值,并将此新值与指定的键关联起来。
下面是computeIfAbsent()方法的基本语法:
V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
其中,key表示想要获取的值的键;mappingFunction是计算函数,用于在键不存在的时候计算值。
下面是一个使用computeIfAbsent()方法的示例代码:
import java.util.HashMap;
import java.util.Map;
public class HashMapComputeIfAbsentExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", null);
Integer aValue = map.computeIfAbsent("a", k -> 3);
Integer bValue = map.computeIfAbsent("b", k -> null);
Integer cValue = map.computeIfAbsent("c", k -> 3);
Integer dValue = map.computeIfAbsent("d", k -> 4);
System.out.println(aValue); // Output: 1
System.out.println(bValue); // Output: 2
System.out.println(cValue); // Output: 3
System.out.println(dValue); // Output: 4
}
}
在这个示例代码中,我们首先创建了一个HashMap对象,然后向其中添加了三对键值对。其中,第三个键”c”对应的值为null。
接着,我们通过computeIfAbsent()方法来获取各个键对应的值。对于键”a”和”b”,它们原本已经有对应的值了,所以计算函数不会被执行。而对于键”c”和”d”,它们原本没有对应的值,所以计算函数被执行了。从输出可以看出,这个方法的确可以根据指定的函数来计算键对应的值。
需要注意的是,当计算函数返回null时,computeIfAbsent()返回的值也为null。这一点可以从示例代码中的第二个计算函数看出。
HashMap computeIfAbsent()方法高级用法
在了解了computeIfAbsent()方法的基础用法后,我们再来看一下一些高级用法。
首先,我们可以通过Lambda表达式来定义计算函数。这种方式非常方便,可以使代码更加简洁。比如,我们可以定义一个计算函数,用于计算一个字符串出现的次数:
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", null);
map.computeIfAbsent("hello", k -> {
int count = 0;
for (String s : map.keySet()) {
count += s.contains(k) ? 1 : 0;
}
return count;
});
在这个示例中,我们首先创建了一个HashMap对象。然后,我们通过computeIfAbsent()方法来计算字符串”hello”出现的次数。在计算函数中,我们遍历了HashMap中的所有键,并通过contains()方法来判断每个键是否包含”hello”子串。如果包含,则将计数器加1。最后,返回计数器的值。
其次,我们还可以使用computeIfAbsent()方法来解决一些复杂的问题。比如,假设我们有一个List列表,其中存储了一些元素。我们想要将这些元素按照首字母分组,并统计各个组中元素的数量。这个问题可以通过computeIfAbsent()方法来解决,代码如下:
List<String> list = Arrays.asList("apple", "banana", "orange", "avocado", "grape", "pear");
Map<Character, Integer> map = new HashMap<>();
list.forEach(s -> map.computeIfAbsent(s.charAt(0), k -> 0));
list.forEach(s -> map.computeIfPresent(s.charAt(0), (k, v) -> v + 1));
System.out.println(map); // Output: {a=2, b=2, g=1, o=1, p=1}
在这个示例中,我们首先创建了一个List对象,其中存储了一些字符串。然后,我们创建了一个HashMap对象,用于存储分组结果。接着,我们通过forEach()方法对List进行遍历,对于每个元素,我们通过computeIfAbsent()方法来保证其首字母在HashMap中存在,并初始化其值为0。
在保证所有首字母都存在的前提下,我们再次对List进行遍历,对于每个元素,我们通过computeIfPresent()方法来增加其对应键的值。最终,我们可以得到分组结果。
需要注意的是,这个示例中我们并没有使用computeIfAbsent()方法的返回值,而是只利用了这个方法来保证键存在。这种用法不是computeIfAbsent()方法的常规用法,但是在一些特定场景下十分实用。
结论
computeIfAbsent()方法是HashMap中一个非常实用的方法。它可以帮助我们解决很多常见的问题,比如计算值、初始化值、统计数量等。在实际开发中,我们可以根据具体问题来灵活使用computeIfAbsent()方法,以提高开发效率和代码可读性。