【Java 8 新特性】Java Map computeIfAbsent() 示例 | 如果计算键值不可用则插入新值

Java Map computeIfAbsent 示例 | 如果计算键值不可用则插入新值

computeIfAbsentjava.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} 

参考文献

【1】Java doc: Map
【2】Java Map computeIfAbsent() Example

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值