computeIfPresent
是 java.util.Map
的默认方法,已在 Java 8 中引入。computeIfPresent
方法为给定键及其关联值计算指定的Map函数,然后更新该键的值,如果指定键的值存在且非空。从 Java 文档中找到方法声明。
default V computeIfPresent(K key,
BiFunction<? super K,? super V,? extends V> remappingFunction)
key 是与值关联的指定键。
remappingFunction 是 Java BiFunction
类型的指定Map函数,用于计算新值。computeIfPresent
方法返回与指定键关联的新值,如果没有则返回 null。
computeIfPresent
方法的工作原理如下。
1. 如果指定的键与非空值相关联,并且由指定Map函数计算的新值也不为空,在这种情况下,computeIfPresent
方法将为指定键放置新值。
2. 如果指定的键与非空值相关联,并且指定Map函数计算的新值为空,在这种情况下,computeIfPresent
方法将删除指定键的条目。
3. 如果指定的键与空值相关联,并且由指定Map函数计算的新值不为空,在这种情况下,computeIfPresent
方法将不执行任何操作。
4. 如果指定的键与非空值关联并且Map函数抛出异常,在这种情况下,Map
不会发生变化。
指定的键与非空值相关联
并且由指定Map函数计算的新值也不为空。
在这种情况下,computeIfPresent
方法将为指定键放置新值。
ComputeIfPresent1.java
import java.util.HashMap;
import java.util.Map;
public class ComputeIfPresent1 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, "Prayag");
String newValue = cityMap.computeIfPresent(102, (k, v) -> v != null ? v.concat("raj") : null);
System.out.println(newValue);
System.out.println(cityMap);
}
}
输出
Prayagraj
{101=Varanasi, 102=Prayagraj}
不使用 computeIfPresent
方法也可以实现相同的效果,如下所示。
ComputeIfPresent11.java
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiFunction;
public class ComputeIfPresent11 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, "Prayag");
BiFunction<Integer, String, String> remappingFunction = (k, v) -> v != null ? v.concat("raj") : null;
int key = 102;
String oldValue = cityMap.get(key);
String newValue = remappingFunction.apply(key, oldValue);
if (cityMap.get(key) != null) {
if (newValue != null)
cityMap.put(key, newValue);
else
cityMap.remove(key);
}
System.out.println(newValue);
System.out.println(cityMap);
}
}
输出
Prayagraj
{101=Varanasi, 102=Prayagraj}
指定的键与非空值相关联
并且由指定Map函数计算的新值为空。
在这种情况下,computeIfPresent
方法将删除指定键的条目。
ComputeIfPresent2.java
import java.util.HashMap;
import java.util.Map;
public class ComputeIfPresent2 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, "Prayag");
cityMap.computeIfPresent(102, (k, v) -> null);
System.out.println(cityMap);
}
}
输出
{101=Varanasi}
指定的键与空值相关联
并且由指定Map函数计算的新值不为空。
在这种情况下,computeIfPresent
方法将什么也不做。 Map
不会有任何变化。
ComputeIfPresent3.java
import java.util.HashMap;
import java.util.Map;
public class ComputeIfPresent3 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, null);
cityMap.computeIfPresent(102, (k, v) -> "Noida");
System.out.println(cityMap);
}
}
输出
{101=Varanasi, 102=null}
指定的键与非空值相关联
并且Map函数抛出异常。
在这种情况下,Map
不会发生变化。
ComputeIfPresent4.java
import java.util.HashMap;
import java.util.Map;
public class ComputeIfPresent4 {
public static void main(String[] args) {
Map<Integer, String> cityMap = new HashMap<>();
cityMap.put(101, "Varanasi");
cityMap.put(102, "Noida");
String newVal = null;
try {
cityMap.computeIfPresent(102, (k, v) -> newVal.concat("Prayag")); //throws exception
} catch (Throwable e) {
System.out.println(e);
}
System.out.println(cityMap);
}
}
输出
java.lang.NullPointerException
{101=Varanasi, 102=Noida}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.concretepage.com/java/java-8/java-map-computeifpresent
内容来源于网络,如有侵权,请联系作者删除!