computeIfAbsent
是java.util.Map
的默认方法,已在Java 8
中引入。
computeIfAbsent
方法在与指定键相关的值不可用或为空时起作用,在这种情况下,computeIfAbsent
方法为该键输入由给定映射函数计算的新值。
从Java
文档中找到该方法的声明。
default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
key
是我们需要关联值的键。
mappingFunction
是计算映射值的java.util.function.function
类型。
computeIfAbsent
返回由给定映射函数计算的现有值或新值。
computeIfAbsent
方法的工作原理如下。
1. 如果指定的键还没有与一个值相关联,并且由映射函数计算的新值不是空的,在这种情况下,computeIfAbsent方法将为指定的键输入新值。
2. 如果指定的键没有与一个值相关联,并且由映射函数计算的新值是空的,在这种情况下,computeIfAbsent
方法将不会为指定的键输入新值。
3. 如果指定的键已经与一个值相关联,并且由映射函数计算的新值不是空的,在这种情况下,computeIfAbsent
方法将不会为指定的键放入新值。
4. 如果指定的键与一个空值相关联,并且由映射函数计算的新值不是空值,在这种情况下,computeIfAbsent
方法将为指定的键设置新值。
例1
指定的键未与值关联
映射函数计算的新值不为空。
在这种情况下,ComputeFabSent
方法将为指定的键放入新值。
ComputeIfAbsent1.java
import java.util.HashMap;
import java.util.Map;
public class ComputeIfAbsent1 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, "Prayag");
String value = cityMap.computeIfAbsent(103, k -> "Noida");
System.out.println(value);
System.out.println(cityMap);
}
}
输出
Noida
{101=Varanasi, 102=Prayag, 103=Noida}
不使用computeIfAbsent
方法也可以实现同样的效果,如下所示。
ComputeIfAbsent11.java
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
public class ComputeIfAbsent11 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, "Prayag");
Function<Integer, String> mappingFunction = k -> "Noida";
int key = 103;
String value = mappingFunction.apply(key);
if (cityMap.get(key) == null) {
if (value != null)
cityMap.put(key, value);
}
System.out.println(value);
System.out.println(cityMap);
}
}
输出
Noida
{101=Varanasi, 102=Prayag, 103=Noida}
再找一个ComputeFabSent
方法的示例。
ComputeIfAbsent12.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ComputeIfAbsent12 {
public static void main(String[] args) {
Map<String, List<String>> map = new HashMap<>();
List<String> countries = new ArrayList<>();
countries.add("Bharat");
map.put("countries", countries);
map.computeIfAbsent("capitals", k -> new ArrayList<>()).add("Delhi");
System.out.println(map);
}
}
输出
{capitals=[Delhi], countries=[Bharat]}
例2
指定的键未与值关联
映射函数计算的新值为空。
在这种情况下,ComputeFabSent
方法不会为指定的键放入新值。
ComputeIfAbsent2.java
import java.util.HashMap;
import java.util.Map;
public class ComputeIfAbsent2 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, "Prayag");
cityMap.computeIfAbsent(103, k -> null);
System.out.println(cityMap);
}
}
输出
{101=Varanasi, 102=Prayag}
例3
指定的键与值关联
映射函数计算的新值不为空。
在这种情况下,ComputeFabSent
方法不会为指定的键放入新值。Map
不会改变。
ComputeIfAbsent3.java
import java.util.HashMap;
import java.util.Map;
public class ComputeIfAbsent3 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, "Prayag");
cityMap.computeIfAbsent(102, k -> "Prayagraj");
System.out.println(cityMap);
}
}
输出
{101=Varanasi, 102=Prayag}
例4
指定的键与空值关联
映射函数计算的新值不为空。
在这种情况下,ComputeFabSent方法将为指定的键放入新值。
ComputeIfAbsent4.java
import java.util.HashMap;
import java.util.Map;
public class ComputeIfAbsent4 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, null);
cityMap.computeIfAbsent(102, k -> "Prayagraj");
System.out.println(cityMap);
}
}
输出
{101=Varanasi, 102=Prayagraj}