Collectors.toMap应用

Collectors.toMap介绍

在真实的业务场景中有很多集合转map的操作,例如

@Data
public class House {private Integer id;        //idprivate Integer ownerid;   //家主编号private String housename;  //家庭名称private String address;    //家庭地址}

模拟数据

/*** @description: List 转 Map 操作*/
public class ListToMap {public static void main(String[] args) {House house = new House(1,1,"aa","北京海淀");House house1 = new House(2,2,"bb","湖北武汉");House house2 = new House(3,3,"cc","浙江杭州");ArrayList<House> houses = new ArrayList<>();houses.add(house);houses.add(house1);houses.add(house2);//在实际项目中我们经常会用到 List 转 Map 操作 ->过去是for循环的操作,现在可以学习如下的方法Collectors.toMap/*** 我们收集一下集合中每个对象的两个单独的属性*/Map<String, String> mapHouse = houses.stream().collect(Collectors.toMap(House::getHousename, House::getAddress));System.out.println(mapHouse);//{aa=湖北武汉, bb=浙江杭州, cc=北京海淀}/*** 前后的属性的数据类型要对应  一般时间业务中收集带有唯一表示的业务数据*/Map<Integer, String> map = houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename));System.out.println(map);//{1=aa, 2=bb, 3=cc}/*** 收集一下属性和对象本身*/Map<Integer, House> houseMap = houses.stream().collect(Collectors.toMap(House::getOwnerid, o -> o));Map<Integer, House> houseMap1 = houses.stream().collect(Collectors.toMap(House::getOwnerid,  Function.identity()));System.out.println(houseMap);/*** {1=House{id=1, ownerid=1, housename='aa', address='北京海淀'}, * 2=House{id=2, ownerid=2, housename='bb', address='湖北武汉'}, * 3=House{id=3, ownerid=3, housename='cc', address='浙江杭州'}}*///业务场景:一般会根据具体的键值 取具体的对象System.out.println(houseMap.get(1));//House{id=1, ownerid=1, housename='aa', address='北京海淀'}//此处的效果同houseMapSystem.out.println(houseMap1);/*** {1=House{id=1, ownerid=1, housename='aa', address='北京海淀'}, * 2=House{id=2, ownerid=2, housename='bb', address='湖北武汉'}, * 3=House{id=3, ownerid=3, housename='cc', address='浙江杭州'}}*/}}

常见操作大家实践即可

houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename));

深入Collectors.toMap

Collectors.toMap 有三个重载方法:

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

参数含义分别是:

keyMapper:Key 的映射函数

valueMapper:Value 的映射函数

mergeFunction:当 Key 冲突时,调用的合并方法

mapSupplier:Map 构造器,在需要返回特定的 Map 时使用

业务场景最多的还是map的键为一个唯一的标识符,值为对象本身!

如果希望得到 Map 的 value 为对象本身时,可以这样写
 

       /*** 收集一下属性和对象本身*/
Map<Integer, House> houseMap = houses.stream().collect(Collectors.toMap(House::getOwnerid, o -> o));
Map<Integer, House> houseMap1 = houses.stream().collect(Collectors.toMap(House::getOwnerid,  Function.identity()));

常见的java.lang.IllegalStateException: Duplicate key 问题处理

我们把做的测试数据 House house = new House(1,1,“aa”,“北京海淀”);
House house1 = new House(2,2,“bb”,“湖北武汉”);
House house2 = new House(3,3,“cc”,“浙江杭州”);
house2修改为: House house2 = new House(3,1,“cc”,“浙江杭州”);
这样Ownerid会重复
当我们执行如下代码时:houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename);
会出错,java.lang.IllegalStateException: Duplicate key

线上业务代码出现Duplicate Key的异常,影响了业务逻辑,查看抛出异常部分的代码

Exception in thread "main" java.lang.IllegalStateException: Duplicate key aaat java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)at java.util.HashMap.merge(HashMap.java:1254)at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)at com.example.cwgl.ListToMap.main(ListToMap.java:28)

解决办法:出现重复时,取前面value的值,或者取后面放入的value值,则覆盖先前的value值

houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename,(v1,v2)->v2));
houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename,(v1,v2)->v1));

对于结果的操作还有很多处理方法,如拼接等

houses.stream().collect(Collectors.toMap(House::getOwnerid, House::getHousename,(v1,v2)->v1+v2));
具体的实践根据具体的业务来操作数据即可

List统计重复数量

final String path = "F:/AppData/API-url.txt";
final List<String> list = BlockIOUtil.readLines("file:" + path);
Map<String, Integer> map = list.stream().collect(Collectors.toMap(it -> it, it -> 1, (val1, val2) -> val1 + 1));
for (Map.Entry<String, Integer> entry : map.entrySet()) {if (entry.getValue() != null && entry.getValue() > 1) {System.out.println(entry.getKey() + "-->" + entry.getValue());}
}

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

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

相关文章

作弊阴影罩棋盘,人工智能咋避嫌?

来源&#xff1a;奇怪的科学家为什么要写这样一句话&#xff0c;就是为了避免剧情和现实生活中发生的事情万一差不多&#xff0c;会侵犯到别人的隐私&#xff0c;发生侵权&#xff0c;给双方带来不必要的麻烦。这位名为刘超的棋手把手机插在上衣兜里&#xff0c;摄像头正对棋盘…

小甲鱼视频教程系列

在学习 Ollydbg 时&#xff0c;发现小甲鱼讲的 Ollydbg 教程还可以&#xff0c;就把小甲鱼的视频整理了下。 小甲鱼主页&#xff1a;https://ilovefishc.com 小甲鱼论坛&#xff1a;https://fishc.com.cn 《零基础入门C语言》&#xff1a;https://www.bilibili.com/video/av277…

ubuntu server版本安装指南(1)

ubuntu是基于GNU/Linux 的操作系统&#xff0c;本身是在同样GNU/Linux 架构下的Debian的基础上的一个版本。由于它在桌面环境上的易用性和精细度是许多人认识了他。ubuntu的强大在一定程度上体现在apt包管理系 统。安装软件不必像以前那样幸苦找到下载地址。编译安装。还要非常…

深入理解Nginx~Nginx的命令行控制

默认情况下&#xff0c;Nginx被安装在目录usrlocal/nginx/中&#xff0c;其二进制文件路径为usrlocal/nginc/sbin/nginx&#xff0c;配置文件路径为usrlocal/nginx/conf/nginx.conf。 &#xff08;1&#xff09;默认方式启动 usrlocal/nginx/sbin/nginx 这时&#xff0c;会读…

Arm中国合资公司具体布局浮出水面

来源&#xff1a;经济观察报摘要&#xff1a;作为全球最具影响力的芯片技术供应商之一&#xff0c;Arm在中国正迎来新的时代。对于Arm与中国合资公司事宜&#xff0c;5月4日下午&#xff0c;Arm授权的代表邮件回复《经济观察报》称&#xff1a;“合资公司目前刚开始运营”&…

汇编逆向基础

汇编逆向基础&#xff1a;https://www.xmind.net/m/kvJK/

转:教你如何备考PMP

随着PMP在国内报考人数、培训机构、培训讲师数量的增多&#xff0c;PMP已经没那么神秘&#xff0c;PMP证书的含金量已经不向有些人宣传的那样眩目&#xff0c;但参加PMP的学习与认证还是会对我们的知识积累及经验总结有一个不错的提高。PMP认证考试的组织者(PMI)规定&#xff0…

深入理解Nginx~运行中的Nginx进程间的关系

在正式提供服务的产品环境下&#xff0c;部署Nginx时都是使用一个master进程来管理多个worker 进程&#xff0c;一般情况下&#xff0c;worker进程的数量与服务器上的CPU核心数相等。每一个worker进程都 是繁忙的&#xff0c;它们在真正地提供互联网服务&#xff0c;master进程…

哥伦比亚大学AI实验室主任Hod Lipson:阻碍无人驾驶技术发展的7个误区

来源&#xff1a;智车科技摘要&#xff1a;我们发现有些针对无人驾驶的误解还在广泛肆意传播&#xff0c;并且这些信息会被反对者拿来和对抗无人驾驶的推广政策。每年&#xff0c;全世界都有将近120万人死于车祸&#xff0c;这个死亡率相当于每年释放10个广岛级别的原子弹爆炸。…

PE文件结构详解 --(完整版)

From&#xff1a;https://blog.csdn.net/adam001521/article/details/84658708 PE结构详解&#xff1a;https://www.cnblogs.com/zheh/p/4008268.html PE格式解析-区段表及导入表结构详解&#xff1a;https://blog.csdn.net/qq_30145355/article/details/78859214 PE文件基本…

Silverlight MMORPG网页游戏开发课程(Game Lesson):目录

[感谢 银光中国 提供本课程所有源码资源分流]一次全新的开始&#xff0c;一次全新的构建与诠释。渴望在时空长廊中寻觅传说中光的起源&#xff0c;我决定用这部课程编写一首血脉喷张之进行曲。一年前&#xff0c;我一个人在战斗&#xff0c;前行&#xff0c;引导我绝不放弃的是…

人工智能下一个热点探讨,为什么要提出互联网大脑模型 ?

作者&#xff1a;刘锋 计算机博士 《互联网进化论作者》前言从2008年发表论文第一次提出互联网大脑模型&#xff0c;时间已经过去十年。撰写这篇文章&#xff0c;主要是详细介绍我们在十年前提出互联网大脑模型的原因&#xff1b;十年来在计算机和智能领域产生了哪些进展&…

深入理解Nginx~Nginx配置的通用语法

Nginx的配置文件其实是一个普通的文本文件。 user nobody; worker_processes 8; error_log varlog/nginx/error.log error; #pid logs/nginx.pid; events {use epoll;worker_connections 50000; } http {include mime.types;default_type application/octet-stream;log_forma…

学会了这些技术,你离BAT大厂不远了

每一个程序员都有一个梦想&#xff0c;梦想着能够进入阿里、腾讯、字节跳动、百度等一线互联网公司&#xff0c;由于身边的环境等原因&#xff0c;不知道 BAT 等一线互联网公司使用哪些技术&#xff1f;或者该如何去学习这些技术&#xff1f;或者我该去哪些获取这些技术资料&am…

LPC2000 UART串口使用心得

针对zgpswh在串口使用上的一些难题&#xff0c;总结个人在前一阶段的理解&#xff0c;比较片面&#xff0c;不对的地方请高手指正。 1、LPC2000 系列芯片的串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器&#xff0c;…

张钹院士:可解释、可理解是人工智能研究的主攻方向 | CCF-GAIR 2018

作者&#xff1a;刘鹏摘要&#xff1a;张钹院士历经了中国人工智能的从无到有&#xff0c;从弱到强&#xff0c;因而他也最能清楚地针对中国人工智能近年来的不同发展状态&#xff0c;发表适合的看法和提出正确的建议。2017 年末清华大学举办的「从阿尔法 Go 到通用人工智能&am…

小甲鱼 OllyDbg 教程系列 (二) :从一个简单的实例来了解PE文件

小甲鱼视频讲解&#xff1a;https://www.bilibili.com/video/av6889190?p6https://www.bilibili.com/video/av6889190?p7 从一个简单的实例来了解PE文件&#xff1a;https://www.freebuf.com/articles/system/86596.htmlhttps://blog.csdn.net/billvsme/article/details/383…

金矿 与 淘沙工

此地是金矿 拥挤着千百万的人 有人利用了金矿 有人做了淘沙工 此地金矿否&#xff1f; 有若没用亦如无 生命流水 金淘沙&#xff1f; 此时的我 身处“金矿” 却用似金的光阴 做着淘沙工作 生命难道仅流水 黄金城市淘沙工&#xff1f; 转载于:https://www.cnblogs.com/freelive…

深入理解Nginx~用于调试进程和定位问题

1、是否以守护进程方式运行Nginx 语法&#xff1a; daemon on|off; 默认&#xff1a; daemon on; 守护进程&#xff08;daemon&#xff09;是脱离终端并且在后台运行的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示&#xff0c;这样一来&#xff0c;进程也…

301跳转的实现

老站首页的pr比较高&#xff0c;除了首页都要做301重定向&#xff0c;但是用了 Response.Status "301 Moved Permanently"; Response.AddHeader("Location", "http://www.baidu.com/");这种方法后发现可以跳转&#xff0c;但是用fid…