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相关推荐

  1. OpenCV与图像处理学习十六——模板匹配

    OpenCV与图像处理学习十六--模板匹配 一.模板匹配介绍 二.代码应用 一.模板匹配介绍 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定目标的图像位于图像的什么地方,进而对图像进行定位. ...

  2. PyTorch框架学习十六——正则化与Dropout

    PyTorch框架学习十六--正则化与Dropout 一.泛化误差 二.L2正则化与权值衰减 三.正则化之Dropout 补充: 这次笔记主要关注防止模型过拟合的两种方法:正则化与Dropout. 一 ...

  3. Python的学习(十六):对文件的操作

    Python的学习(十六):对文件的操作 编码格式的介绍 Python中的解释器使用的是Unicode(内存) .py文件在磁盘上使用UTF-8存储(外存) 如何修改文件格式?不写的话默认为UTF-8 ...

  4. 强化学习(十六) 深度确定性策略梯度(DDPG)

    在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...

  5. java map class_Java:声明一个包含两个相关泛型类型的Map(Map,Class ?extends ClassB )...

    另一种方法是提供自己的Map实现.如果扩展现有实现并使用新类型,则不需要太多代码: public class CompatibleHashMap extends HashMap, ClassB> ...

  6. java 集合读写同步_JAVA多线程学习十六 - 同步集合类的应用

    1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...

  7. BW学习十六(dso)

    现在社会,都很喜欢炒作名词,就是俗话说的换汤不换药,纵观计算机的发展历史,也难免俗,而DSO就是这样一个产品,DSO原称ODS,即营运数据存储,现称为数据存储对象,概念改变但是实质不变,不管SAP认为 ...

  8. c++面向对象高级编程 学习十六 vptr和vtbl

    当一个类中有一个或多个虚函数时,内存中会多一个虚指针(vptr,virtual pointer),指向一个虚表(vtbl,virtual table) 父类有虚函数,则子类一定有虚函数 在下图示意图中 ...

  9. element子组件中的校验_Salesforce LWC学习(十六) Validity 在form中的使用浅谈

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/lightning-input/documentation h ...

最新文章

  1. LeetCode简单题之二进制表示中质数个计算置位
  2. 数据库问题解决后,应用面对的挑战
  3. 浅谈深浅拷贝问题(这里只针对拷贝构造函数和赋值运算符重载)和简易srting类模拟实现
  4. mpvue 微信小程序 Image 图片实现宽度100%,高度自适应
  5. MFC将bmp图像设为背景
  6. MySQL将一张表的某些列数据,复制到另外一张表,并且修改某些内容
  7. 跳槽 ,你跳的是工资,还是阶层?
  8. Win10镜像下载之后怎么安装系统
  9. 别在那抱怨高考怎么不考DOTA呢!!高考就是考DOTA你也不行!
  10. android 图片处理过程中添加进度条,[Android] 随时拍图像处理部分总结及源码分......
  11. mcc_generated_files/eusart1.c:208:: error: (1098) conflicting declarations for variable “
  12. 华为nova2连不上计算机,华为nova2正式发布,连个5G WIFI都不支持?
  13. Electron学习笔记(五) 通过Addon(n-api)实现可扩展接口
  14. 深度学习实战-词嵌入计算文本相似性
  15. Solidity入门级别|用智能合约实现房屋贷款系统
  16. 锁定单个或多个单元格与解锁方法
  17. 基于位置(Lbsn)的社交网络中混合推荐算法的设计
  18. XP和Java大战,谁胜一筹?
  19. Kafka 生产者压缩算法是什么?何时压缩和解压?什么压缩性能好?
  20. Simple Wallpaper Changer

热门文章

  1. Serverless 初体验:快速开发与部署一个Hello World(Java版)
  2. 原来这就是Java代码生成器的原理啊,太简单了
  3. 面试:HashMap 夺命二十一问!
  4. 合理利用延迟初始化优化 Spring Boot
  5. 答应我!别再写上千行的类了,好吗?
  6. linq调用mysql函数_mysql-在LINQ中执行FirstOrDefault的另一种方法
  7. Transformer LambdaNetworks
  8. Python 多进程/Event 重复使用唤醒
  9. 用Python开始机器学习(3:数据拟合与广义线性回归)
  10. 高斯拉普拉斯金字塔资料整理