java.util.Map中的putIfAbsent、computeIfAbsent、computeIfPresent、compute基本使用

本文主要是介绍java.util.Map中的putIfAbsent、computeIfAbsent、computeIfPresent、compute基本使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、put

插入或覆盖

map.put(K,V);

 

2、putIfAbsent

     以下情况插入新值

     1)key不存在

     2)key存在,但value==null

     插入新value

 

map.putIfAbsent(K,V)//个人理解,相当于
if(!map.containsKey(K)||map.get(K)==null){map.put(K,V)
}

 

3、computeIfAbsent

     以下情况插入新值

     1)key不存在

     2)key存在,但value==null

     插入新value

   与putIfAbsent不同的是,当插入的value==null时,computeIfAbsent是不做插入的,而putIfAbsent做插入。

map.computeIfAbsent(K,v->{return new Object();});//个人理解,相当于
if(!map.containsKey(K)||map.get(K)==null){if(V!=null){map.put(K,V);}else{}
}

 

4、computeIfPresent

    只有key存在才做操作

      1)新value != null,覆盖原值

      2)新value == null,移除对应的key

map.computeIfPresent(K,(k,v)->{return new Object();});//个人理解,相当于
if(map.containsKey(K)){if(V!=null){map.put(K,V);}else{map.remove(K);}
}

 

5、compute

    1)新value != null,有该key的值覆盖,无则插入

    2)新value == null,无该key什么都不做,有则移除

map.putIfAbsent(K,V);//个人理解,相当于if(V!=null){map.put(K,V);
}else{if(map.containsKey(K)){map.remove(K);}else{}
}

 

测试用例:

@Testpublic void test29(){Map<String,String> mm=new HashMap<>();mm.putIfAbsent("key1","val1");mm.putIfAbsent("key11",null);mm.putIfAbsent("key11","val11");mm.putIfAbsent("key11","val12");mm.putIfAbsent("key111",null);mm.putIfAbsent("key112",null);mm.computeIfAbsent("key2",v->{return "val2";});mm.computeIfAbsent("key22",v->{return null;});mm.computeIfAbsent("key22",v->{return "val22";});mm.computeIfAbsent("key22",v->{return "val23";});mm.computeIfAbsent("key222",v->{return null;});mm.computeIfAbsent("key112",v->{return "val112";});mm.computeIfAbsent("key3",v->{return "val3";});mm.computeIfAbsent("key4",v->{return "val4";});mm.computeIfAbsent("key5",v->{return "val5";});mm.computeIfAbsent("key5",v->{return "val555";});mm.computeIfAbsent("key6",v->{return null;});printMap(mm);System.out.println();mm.computeIfPresent("key1",(k,v)->{return "test1";});
//        mm.put("key1",null);mm.computeIfPresent("key100",(k,v)->{return "Test2";});mm.computeIfPresent("key3",(k,v)->{return null;});mm.compute("key4",(k,v)->{return "Test3";});mm.compute("key5",(k,v)->{return null;});mm.compute("key55",(k,v)->{return null;});mm.compute("key555",(k,v)->{return "val555";});printMap(mm);}private void printMap(Map<String,String> mm){Iterator<Map.Entry<String, String>> iterator = mm.entrySet().iterator();while(iterator.hasNext()){Map.Entry<String, String> next = iterator.next();System.out.println("key:"+next.getKey()+"  value:"+next.getValue());}}

输出:

key:key1  value:val1
key:key2  value:val2
key:key5  value:val5
key:key3  value:val3
key:key4  value:val4
key:key22  value:val22
key:key11  value:val11
key:key112  value:val112
key:key111  value:nullkey:key1  value:test1
key:key2  value:val2
key:key4  value:Test3
key:key555  value:val555
key:key22  value:val22
key:key11  value:val11
key:key112  value:val112
key:key111  value:null

 

这篇关于java.util.Map中的putIfAbsent、computeIfAbsent、computeIfPresent、compute基本使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730047

相关文章

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建