Java Map computeIfPresent()方法使用示例

x33g5p2x  于2022-09-24 转载在 Java  
字(3.2k)|赞(0)|评价(0)|浏览(236)

computeIfPresentjava.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 不会发生变化。

示例-1

指定的键与非空值相关联
并且由指定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}

示例-2

指定的键与非空值相关联
并且由指定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}

示例-3

指定的键与空值相关联
并且由指定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}

示例-4

指定的键与非空值相关联
并且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}

相关文章

微信公众号

最新文章

更多