Java HashMap compute()方法及示例
HashMap类的 compute(Key, BiFunction) 方法允许你更新HashMap中的一个值。compute()方法试图为指定的键和其当前的映射值计算一个映射(如果没有找到当前的映射,则为空)。该方法用于 自动更新 HashMap中 给定键的值 。
- 如果在compute中传递的重映射函数返回null,则该映射将从Map中删除(如果最初没有,则保持不存在)。
-
如果重映射函数抛出一个异常,那么该异常将被重新抛出,并且当前的映射将保持不变。
-
在计算过程中,重映射函数不应该能够修改这个映射。
compute()方法可以用来更新HashMap内部的一个现有值。 例如。
递增映射的一个int值:map.compute(key, (k, v) -> (v == null) ?1 : v+1)
- 如果compute()方法的重映射函数在计算过程中修改了这个映射,这个方法的默认实现对检测错误没有保证。
异常 :
本方法的非并发实现应该覆盖本方法,如果在计算过程中检测到映射的变化,则抛出ConcurrentModificationException。并发的实现应该覆盖此方法,如果在计算过程中检测到映射的变化,就抛出一个IllegalStateException,结果是计算永远不会完成。
该方法的默认实现对该方法的同步性或原子性不做任何保证。任何提供原子性保证的实现都必须覆盖此方法并记录其并发性属性。
语法
default V
compute(K key,
BiFunction<? super K, ? super V, ?
extends V> remappingFunction)
参数: 该方法接受两个参数。
- key :与该值相关的键。
- remappingFunction :计算该值的函数。
返回: 该方法返回 与指定键相关的新值,如果没有则返回空值。
异常: 这个方法会抛出。
- NullPointerException :如果键是空的,并且这个地图不支持空键,或者remappingFunction是空的。
- UnsupportedOperationException : 如果这个地图不支持put操作。
- ClassCastException : 如果键或值的类别阻止它被存储在这个地图中。
- IllegalArgumentException :如果键或值的某些属性使其不能被存储在这个地图中。
下面的程序说明了 compute(Key, BiFunction) 方法。
程序1 :
// Java program to demonstrate
// compute(Key, BiFunction) method.
import java.util.*;
public class GFG {
// Main method
public static void main(String[] args)
{
// Create a Map and add some values
Map<String, String> map = new HashMap<>();
map.put("Name", "Aman");
map.put("Address", "Kolkata");
// Print the map
System.out.println("Map: " + map);
// remap the values using compute() method
map.compute("Name", (key, val)
-> val.concat(" Singh"));
map.compute("Address", (key, val)
-> val.concat(" West-Bengal"));
// print new mapping
System.out.println("New Map: " + map);
}
}
输出。
Map: {Address=Kolkata, Name=Aman}
New Map: {Address=Kolkata West-Bengal, Name=Aman Singh}
程序2
// Java program to demonstrate
// compute(Key, BiFunction) method.
import java.util.*;
public class GFG {
// Main method
public static void main(String[] args)
{
// Create a Map and add some values
Map<String, Integer> map = new HashMap<>();
map.put("Key1", 12);
map.put("Key2", 15);
// print map details
System.out.println("Map: " + map);
// remap the values
// using compute method
map.compute("Key1", (key, val)
-> (val == null)
? 1
: val + 1);
map.compute("Key2", (key, val)
-> (val == null)
? 1
: val + 5);
// print new mapping
System.out.println("New Map: " + map);
}
}
输出。
Map: {Key2=15, Key1=12}
New Map: {Key2=20, Key1=13}
程序3: 显示NullPointerException
// Java program to demonstrate Exception thrown by
// compute(Key, BiFunction) method.
import java.util.*;
public class GFG {
// Main method
public static void main(String[] args)
{
// create a Map and add some values
Map<String, Integer> map = new HashMap<>();
map.put("Key1", 12);
map.put("Key2", 15);
// print map details
System.out.println("Map: " + map);
try {
// remap the values using compute() method
// passing null value will throw exception
map.compute(null, (key, value)
-> value + 3);
System.out.println("New Map: " + map);
}
catch (NullPointerException e) {
System.out.println("Exception: " + e);
}
}
}
输出。
Map: {Key2=15, Key1=12}
Exception: java.lang.NullPointerException
参考文献: https://docs.oracle.com/javase/10/docs/api/java/util/HashMap.html#compute(K, java.util.function.BiFunction)