java8新特性之toMap的用法——全网独一无二的通俗易懂的讲解

news2024/10/6 0:35:21

对于java8的新特性toMap方法,相信有很多人都在工作中用过,接下来就通俗易懂的讲解一下toMap吧

先来看看官网对于toMap方法的解释
toMap有个三个重载的方法,每一个重载方法的详解分别如下

(1)方法1:两个参数

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper) {
return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}

(2)方法2:三个参数

public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,
BinaryOperator mergeFunction)
{
return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}

(3)方法3:四个参数

public static <T, K, U, M extends Map<K, U>>
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,BinaryOperator mergeFunction,Supplier mapSupplier)

{
BiConsumer<M, T> accumulator
= (map, element) -> map.merge(keyMapper.apply(element),
valueMapper.apply(element), mergeFunction);
return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}

对于上述三个方法中每个参数做下解释
keyMapper:Key 的映射函数
valueMapper:Value 的映射函数
mergeFunction:当 Key 冲突时,调用的合并方法
mapSupplier:Map 构造器,在需要返回特定的 Map 时使用

补充一个重要的知识点,接下来讲解时会依照这个规则讲解

针对于Map集合,在执行put方法时
map.put(k1,v1);
map.put(k1,v2);
最终集合中保留下来的元素是[k1,v1]
总结:每次往Map集合put添加相同的key值时,后面的key对应的value会覆盖前面的那个key对应的value值。


官网看完了接下来开始进行针对性通俗易懂的解释
(1)针对于两个参数的toMap方法,这里简写为toMap(key,value);
循环执行toMap方法的执行的效果相当于

Map map=new HashMap();
for(循环条件) {
if(map.containsKey()){
throw new RuntimeException(“xxxxxx”);
}
map.put(key,value);
}
解析:在执行toMap方法在收集元素时,如果遇到了重复的key时,它无法解决这个冲突,即此时会报错。
即如果在循环执行toMap方法,并且往map集合插入重复的key时,默认会报错,具体原因可参考源码。

实践案例:
定义一个User(name=zs,age=23,idNumer=13245906)对象,它有三个属性,

1> Map<String,Integer> map=userList.stream().toMap(u->u.getName,u->getAge);
用于收集user类的name与age属性,并且将以key-value键值对的方式插入到map集合中
.
2>Map<String,User> map=userList.stream().toMap(u->u.getName,u->u);
用于收集user类的name与User类的对象,并且将key-value键值对的方式插入到map集合中
.
3>Map<String,User> map=userList.stream().toMap(u->u.getName,Function.identity());
用于收集user类的name与User类的对象,并且将key-value键值对的方式插入到map集合中。

注意:这里的Function.identity()是对传入一个对象,并原封不动的返回的是个简法。
在这里插入图片描述
总结:使用这种toMap方法在收集元素时,如果存在重复的Key值时,在收集的过程中会发生冲突,直接导致的后果就是报错。如果想要解决冲突,请参考第二种方法


(2)针对于三个参数的toMap方法,这里简写为两种方式
方式1:toMap(key,value,(k1,k2)->k1);
方式2:toMap(key,value,(k1,k2)->k2);
这两种方式看上去没多大区别,但是意义上却大相径庭,来看看分解后的效果讲解吧

方式1:循环执行toMap方法的执行的效果相当于

Map map=new HashMap();
for(循环条件) {
if(!map.containsKey()){
map.put(key,value);
}
}
总结:方式1中的toMap方法在收集元素时,如果遇到了重复的key时,它会放弃收集后面的那个key对应的元素。(k1,k2)->k1就表示k1==k2相同时,保留前面的k1那个元素,放弃k2那个元素。

方式2:循环执行toMap方法的执行的效果相当于

Map map=new HashMap();
for(循环条件) {
map.put(key,value);
}
总结:方式1中的toMap方法在收集元素时,如果遇到了重复的key时,它会放弃收集前面的那个key对应的元素。(k1,k2)->k2就表示k1==k2相同时,保留后面最新收集的k2那个元素,放弃以前收集过的k1那个元素。

实践案例:
定义一个User(name=zs,age=23,idNumer=13245906)对象,它有三个属性

方式1
Map<String,Integer> map=userList.stream().toMap(u->u.getName,u->getAge,(k1,k2)->k1);
用于收集user类的name与age属性,并且将以key-value键值对的方式插入到map集合中.
如果在收集过程中发现重名的name值,则保留原先集合中存在的那个key及其对应的value值。舍弃最新待收集的key及其对应的value
.
方式2
Map<String,Integer> map=userList.stream().toMap(u->u.getName,u->getAge,(k1,k2)->k2);
用于收集user类的name与age属性,并且将以key-value键值对的方式插入到map集合中.
如果在收集过程中发现重名的name值,则舍弃原先集合中存在的那个key及其对应的value值。保留最新待收集的key及其对应的value


(3)针对于四个参数的toMap方法,这里简写为多种方式
方式1:toMap(key,value,(k1,k2)->k1,HashMap::New);
toMap(key,value,(k1,k2)->k2,HashMap::New);
方式2:toMap(key,value,(k1,k2)->k1,TreeMap::New);
toMap(key,value,(k1,k2)->k2,TreeMap::New);
可以对收集到TreeMap集合中的元素按照相应的排序规则进行排序
方式3:toMap(key,value,(k1,k2)->k1,LinkedHashMap::New);
toMap(key,value,(k1,k2)->k2,LinkedHashMap::New);
可以保证收集到LinkedHashMap集合中的元素依旧保持原来的顺序

实践举例:这三种方式其实没多大区别,我们拿其中一个方式举例

针对方式3的toMap(key,value,(k1,k2)->k2,LinkedHashMap::New); 你可以这样理解。
Map map=new LinkedHashMap();
for(循环条件) {
map.put(key,value);
}
解析:在执行toMap方法在收集元素时,创建一个LinkedHashMap集合,然后使用该集合来收集元素,其余的效果同toMap(key,value,(k1,k2)->k2);一样。

经过刚刚的举例讲解,其实也能大概理解这种方式的含义了,它就是在执行toMap方法时构建一个自定义的Map容器,然后循环执行toMap方法时往集合里收集元素,所以该系列方法同三个参数的toMap方法原理几乎一摸一样。

默认情况下,toMap(key,value)与toMap(key,value,(k1,k2)->k1);方法在收集元素时都是构建的一个HashMap容器,然后使用HashMap容器去存储元素,但是HashMap集合我们都知道它是无序的,且无法针对集合中的元素进行排序。所以如果你在工作中有需要针对集合元素进行排序的需求时请使用四个参数的toMap方法

总结
(1)toMap(key,value),创建一个HashMap集合用于收集元素,当在收集时出现了重复的key值,它会直接报错,并且中断收集元素到HashMap集合

(2)toMap(key,value,(k1,k2)->k1)创建一个HashMap集合用于收集元素,当在收集时出现了重复的key值时,它会根据(k1,k2)->k1)或者(k1,k2)->k2)这两种规则解决key值重复的冲突并收集元素到HashMap集合

(3) toMap(key,value,(k1,k2)->k2,LinkedHashMap::New)
创建一个LinkedHashMap集合用于收集元素,当在收集时出现了重复的key值时,它会根据(k1,k2)->k1)或者(k1,k2)->k2)这两种规则解决key值重复的冲突并收集元素到LinkedHashMap集合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot整合kafka到底怎么使用? (简单案例介绍——存放104协议解析报文信息)

前言 由于业务要求&#xff0c;我需要将104协议的报文内容解析后传到kafka里&#xff0c;然后程序也是一个SpringBoot项目&#xff0c;所以本篇文章我想说一说我是如何将那些数据传到kafka中并判断其是否消费&#xff0c;至于104协议的报文内容的解析和通信在此不去介绍&#…

【javassist】javassist 入门案例 生成类

1.概述 前面介绍的ASM入门门槛还是挺高的,需要跟底层的字节码指令打交道,优点是小巧、性能好。Javassist是一个性能比ASM稍差但使用起来简单很多的字节码操作库,不需要使用者掌握字节码指令,由东京工业大学的数学和计算机科学系的教授Shigeru Chiba开发。 本节将分为两个…

2022卡塔尔世界杯。CSDN世界杯勋章来啦

卡塔尔世界杯正在如火如茶的举办着&#xff0c;在比赛场上&#xff0c;我看到了来自世界各地的球队&#xff0c;他们都充满活力&#xff0c;充满激情&#xff0c;每一支球队都在努力的拼搏&#xff0c;无论是为了胜利&#xff0c;还是为了荣誉。我看到了一支支优秀的球队&#…

前端分页处理

页面中实现的分页效果&#xff0c;要么后端提供接口&#xff0c;每次点击下一页就调用接口&#xff0c;若不提供接口&#xff0c;分页得前端自己去截取。 方法一&#xff1a;slice方法 slice(参数1&#xff0c;参数2)方法是返回一个新的数组对象&#xff0c;左开右闭 参数1&…

Mel spectrum梅尔频谱与MFCCs

梅尔频谱和梅尔倒谱MFCCs是使用非常广泛的声音特征形式。 1.Mel-spectrogram梅尔语谱图 机器学习的第一步都是要提取出相应的特征(feature)&#xff0c;如果输入数据是图片&#xff0c;例如28*28的图片&#xff0c;那么只需要把每个像素(pixel)作为特征&#xff0c;对应的像素…

【数据结构】链表定义及其常用的基本操作(C/C++)

目录 ●图示 ●链表类型定义 ●常用的基本操作&#xff08;单链表&#xff09; ●简单案例 ●图示 ●链表类型定义 1.单链表存储结构的定义 typedef struct lnode{elemtype data;struct lnode *next; }lnode,*linklist; 定义链表L&#xff1a;linklist &L&#x…

Windows系统服务器如何架设网站

Windows系统服务器如何架设网站 架设网站我们的需服务器必须要有iis功能&#xff0c;我们随便找个网站素材进行搭建 大家跟着我的步骤操作就可以啦 下面我们以Windows server 2008系统为例 右键我的电脑----管理-----角色-----web服务器&#xff08;iis&#xff09; Internet信…

值得一看!从0编写一份PID控制代码

【推荐阅读】 浅析linux 系统进程冻结&#xff08;freezing of task&#xff09; 深入linux内核架构--进程&线程 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 轻松学会linux下查看内存频率,内核函数,cpu频率 概述Linux内核驱动之GPI…

Servlet与表单、数据库综合项目实战【学生信息管理】

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

开关电源环路稳定性分析(07)——电压型补偿网络

大家好&#xff0c;这里是大话硬件。 在前面的文章中&#xff0c;已经分析了控制级和功率级的传递函数&#xff0c;这一节咱们来分析反馈级的传递函数。 在分析反馈网络的传递函数之前&#xff0c;我想&#xff0c;应该有几个问题需要做一下介绍。 1. 功率级和控制级传递函数…

游戏开发41课 unity shader 优化

Shader有专门语言用来编写&#xff0c;常见类型有DirectX的HLSL&#xff0c;OpenGL的GLSL以及NVIDIA的Cg&#xff0c;为了优化shader代码&#xff0c;我们需要知道代码从被编写到被执行的流程&#xff0c;知道什么样的代码是不好的。 注意点&#xff1a; 避免if、switch分支语…

关于前端低代码的一些个人观点

2022&#xff0c;低代码彻底火了&#xff0c;甚至火到没有点相关经验&#xff0c;都不好意思出去面试的程度&#xff0c;堪称lowcode“元年”。在整个互联网大裁员的背景下&#xff0c;无论你是否相信它是降本提效的利器&#xff0c;彷佛都不重要了。因为行业趋势总是这般浩浩荡…

为什么其他地方的智能网联汽车产业都跟着北京模式走?

随着新一轮科技革命和产业变革加速演进&#xff0c;智能网联汽车已成为全球汽车产业发展的战略方向&#xff0c;是全球大国竞争的重要科技和产业领域。在技术路线层面&#xff0c;我国率先提出车路云融合的智能网联汽车“中国方案”&#xff0c;该路线已逐步成为国际共识。在产…

大学生端午节网页作业制作 学生端午节日网页设计模板 传统文化节日端午节静态网页成品代码下载 端午节日网页设计作品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【云原生】二进制k8s集群(下)部署高可用master节点

内容预知 本次部署说明 本次部署的架构组件 1. 新master节点的搭建 1.1 对master02 进行初始化配置 1.2 将master01的配置移植到master02 2.负载均衡的部署 3. k8s的web UI界面的搭建 二进制部署k8s集群部署的步骤总结 &#xff08;1&#xff09;k8s的数据存储中中心的搭建…

Spring项目建立过程

1&#xff0c;导入依赖 导入Spring依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> 2&#xff0c;实现部分 2.1 自动给我们请求返回一个登录页面&am…

【计算机网络】物理层

物理层考虑的是在各种传输媒体上传输比特流&#xff0c;而不是指具体的传输媒体。物理层作用是尽可能地屏蔽媒体之间的差异。 物理层的主要任务是描述与传输媒体有关的一些特性&#xff1a; 机械特性、电气特性、功能特性、过程特性。 数据通信系统可分为&#xff1a;源系统、…

攻击类型分析

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

Vue系列之组件化

文章の目录一、组件化开发思想1、现实中的组件化思想体现2、编程中的组件化思想体现3、组件化规范: Web Components二、组件注册1、全局组件注册语法2、组件语法3、组件注册注意事项4、局部组件注册写在最后一、组件化开发思想 1、现实中的组件化思想体现 标准分治重用组合 2…

k8s网络策略

网络策略介绍 网络策略官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/ 网络策略是控制Pod之间如何进行通信的规则&#xff0c;它使用标签来筛选Pod&#xff0c;并在该组Pod之上定义规则来定义管控其流量&#xff0c;…