map赋值给另一个map_Java学习(十六): Lambda操作Map
1. Java8新加入的lambda方法
由于继承关系,他们相应的子类也都会继承这些新方法。
2. forEach()
该方法签名为void forEach(BiConsumer super K,? super V> action),作用是对Map中的每个映射执行action指定的操作,其中BiConsumer是一个函数接口,里面有一个待实现方法void accept(T t, U u)。BinConsumer接口名字和accept()方法名字都不重要。
2.1 示例:遍历输出Map
需求:假设有一个成绩单Map,遍历输出Map中的所有映射关系.
2.2 Java8以前的代码
HashMap map = new HashMap<>();map.put("张三", 62);map.put("李四", 66);map.put("王麻子", 89);for(Map.Entry entry : map.entrySet()){ System.out.println(entry.getKey() + " => " + entry.getValue());}/**输出:李四 => 66张三 => 62王麻子 => 89*/
2.3 匿名内部类代码
HashMap map = new HashMap<>();map.put("张三", 62);map.put("李四", 66);map.put("王麻子", 89);map.forEach(new BiConsumer() { @Override public void accept(String s, Integer integer) { System.out.println(s + " => " + integer); }});/**输出:李四 => 66张三 => 62王麻子 => 89*/
2.4 使用lambda
HashMap map = new HashMap<>();map.put("张三", 62);map.put("李四", 66);map.put("王麻子", 89);map.forEach((k,v)-> { System.out.println(k + " => " + v);});/**输出:李四 => 66张三 => 62王麻子 => 89*/
3.replaceAll()
该方法签名为replaceAll(BiFunction super K,? super V,? extends V> function),作用是对Map中的每个映射执行function指定的操作,并用function的执行结果替换原来的value,其中BiFunction是一个函数接口,里面有一个待实现方法 R apply(T t, U u)
3.1 示例:将单词都转换成大写
需求:有一个数字到对应英文单词的Map,将单词都转换成大写.
3.2 Java8以前的代码
HashMap map = new HashMap<>();map.put(1, "c");map.put(2, "go");map.put(3, "java");map.put(4, "php");for (Map.Entry entry : map.entrySet()){ entry.setValue(entry.getValue().toUpperCase());}System.out.println(map);//输出:{1=C, 2=GO, 3=JAVA, 4=PHP}
3.3 匿名内部类代码
HashMap map = new HashMap<>();map.put(1, "c");map.put(2, "go");map.put(3, "java");map.put(4, "php");map.replaceAll(new BiFunction() { @Override public String apply(Integer integer, String s) { return s.toUpperCase(); }});System.out.println(map);// 输出:{1=C, 2=GO, 3=JAVA, 4=PHP}
3.4 使用lambda
HashMap map = new HashMap<>();map.put(1, "c");map.put(2, "go");map.put(3, "java");map.put(4, "php");map.replaceAll((k,v)->v.toUpperCase());System.out.println(map);// 输出:{1=C, 2=GO, 3=JAVA, 4=PHP}
4. merge()
该方法签名为 merge(K key, V value, BiFunction super V,? super V,? extends V> remappingFunction)。作用是:它将新的值赋值到 key (如果不存在)或更新给定的key 值对应的 value。即key存在则更新,不存在则赋值。
4.1 错误信息拼接
一个比较常见的场景是将新的错误信息拼接到原来的信息上,比如:
HashMap stringStringHashMap = new HashMap<>(1);stringStringHashMap.put("error", "执行错误,");System.out.println(stringStringHashMap); // {error=执行错误}// 使用mergestringStringHashMap.merge("error", "其他错误信息.....", (v1, v2) -> v1 + v2);System.out.println(stringStringHashMap); // {error=执行错误,其他错误信息.....}
4.2 其他示例
- Java 8 中 Map 骚操作之 merge() 的用法
5.compute()
该方法签名为 compute(K key, BiFunction super K,? super V,? extends V> remappingFunction),作用是把remappingFunction的计算结果关联到key上,如果计算结果为null,则在Map中删除key的映射.
5.1 统计一个List 中每个元素出现的次数
List list = Arrays.asList("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g");System.out.println("使用 compute 计算元素出现的次数:");Map countsMap = new HashMap<>(6);// 此时:新值 = 旧值 + 1list.forEach(str -> countsMap.compute(str, (k, v) -> v == null ? 1 : v + 1));System.out.println(countsMap);/**使用 compute 计算元素出现的次数:{a=1, b=2, c=3, d=3, f=2, g=1}*/
6.computeIfAbsent()
该方法签名为 V computeIfAbsent(K key, Function super K,? extends V> mappingFunction), 作用:只有在当前Map中不存在key值的映射或映射值为null时,才调用mappingFunction,并在mappingFunction执行结果非null时,将结果跟key关联.
6.1 示例:条件判断和添加操作合二为一
computeIfAbsent()常用来对Map的某个key值建立初始化映射.比如我们要实现一个多值映射,Map的定义可能是Map,要向Map中放入新值,可通过如下代码实现
6.2 Java8以前的代码
Map> map = new HashMap<>();if(map.containsKey(1)){ map.get(1).add("PHP");}else{ Set valueSet = new HashSet(); valueSet.add("PHP"); map.put(1, valueSet);}
6.3 使用lambda
Map> map = new HashMap<>();map.computeIfAbsent(1, v -> new HashSet()).add("Java");
7.computeIfPresent()
该方法签名为 V computeIfPresent(K key, BiFunction super K,? super V,? extends V> remappingFunction),作用跟computeIfAbsent()相反,即,只有在当前Map中存在key值的映射且非null时,才调用remappingFunction,如果remappingFunction执行结果为null,则删除key的映射,否则使用该结果替换key原来的映射.
7.1 使用示例
HashMap map = new HashMap<>();map.put("1", 1);map.put("2", 2);map.put("3", 3);map.put("4", 3);//只对map中存在的key对应的value进行操作Integer integer = map.computeIfPresent("3", (k, v) -> v + 1);System.out.printf("修改key=3得值为: %d", integer);System.out.printf("修改后的map为: %s", map.toString());// 触发remappingFunction,并返回执行结果为null,从而删除key=4map.computeIfPresent("4", (k, v) -> { System.out.println("调用remappingFunction = [k=" + k + "; v=" + v + "]"); return null;});System.out.printf("触发remappingFunction后的,map为: %s", map.toString());/**输出:修改key=3得值为: 4修改后的map为: {1=1, 2=2, 3=4, 4=3}调用remappingFunction = [k=4; v=3]触发remappingFunction后的,map为: {1=1, 2=2, 3=4}*/
map赋值给另一个map_Java学习(十六): Lambda操作Map相关推荐
- OpenCV与图像处理学习十六——模板匹配
OpenCV与图像处理学习十六--模板匹配 一.模板匹配介绍 二.代码应用 一.模板匹配介绍 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定目标的图像位于图像的什么地方,进而对图像进行定位. ...
- PyTorch框架学习十六——正则化与Dropout
PyTorch框架学习十六--正则化与Dropout 一.泛化误差 二.L2正则化与权值衰减 三.正则化之Dropout 补充: 这次笔记主要关注防止模型过拟合的两种方法:正则化与Dropout. 一 ...
- Python的学习(十六):对文件的操作
Python的学习(十六):对文件的操作 编码格式的介绍 Python中的解释器使用的是Unicode(内存) .py文件在磁盘上使用UTF-8存储(外存) 如何修改文件格式?不写的话默认为UTF-8 ...
- 强化学习(十六) 深度确定性策略梯度(DDPG)
在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...
- java map class_Java:声明一个包含两个相关泛型类型的Map(Map,Class ?extends ClassB )...
另一种方法是提供自己的Map实现.如果扩展现有实现并使用新类型,则不需要太多代码: public class CompatibleHashMap extends HashMap, ClassB> ...
- java 集合读写同步_JAVA多线程学习十六 - 同步集合类的应用
1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...
- BW学习十六(dso)
现在社会,都很喜欢炒作名词,就是俗话说的换汤不换药,纵观计算机的发展历史,也难免俗,而DSO就是这样一个产品,DSO原称ODS,即营运数据存储,现称为数据存储对象,概念改变但是实质不变,不管SAP认为 ...
- c++面向对象高级编程 学习十六 vptr和vtbl
当一个类中有一个或多个虚函数时,内存中会多一个虚指针(vptr,virtual pointer),指向一个虚表(vtbl,virtual table) 父类有虚函数,则子类一定有虚函数 在下图示意图中 ...
- element子组件中的校验_Salesforce LWC学习(十六) Validity 在form中的使用浅谈
本篇参考: https://developer.salesforce.com/docs/component-library/bundle/lightning-input/documentation h ...
最新文章
- LeetCode简单题之二进制表示中质数个计算置位
- 数据库问题解决后,应用面对的挑战
- 浅谈深浅拷贝问题(这里只针对拷贝构造函数和赋值运算符重载)和简易srting类模拟实现
- mpvue 微信小程序 Image 图片实现宽度100%,高度自适应
- MFC将bmp图像设为背景
- MySQL将一张表的某些列数据,复制到另外一张表,并且修改某些内容
- 跳槽 ,你跳的是工资,还是阶层?
- Win10镜像下载之后怎么安装系统
- 别在那抱怨高考怎么不考DOTA呢!!高考就是考DOTA你也不行!
- android 图片处理过程中添加进度条,[Android] 随时拍图像处理部分总结及源码分......
- mcc_generated_files/eusart1.c:208:: error: (1098) conflicting declarations for variable “
- 华为nova2连不上计算机,华为nova2正式发布,连个5G WIFI都不支持?
- Electron学习笔记(五) 通过Addon(n-api)实现可扩展接口
- 深度学习实战-词嵌入计算文本相似性
- Solidity入门级别|用智能合约实现房屋贷款系统
- 锁定单个或多个单元格与解锁方法
- 基于位置(Lbsn)的社交网络中混合推荐算法的设计
- XP和Java大战,谁胜一筹?
- Kafka 生产者压缩算法是什么?何时压缩和解压?什么压缩性能好?
- Simple Wallpaper Changer