java stream list转map
java 8 使用stream流来对集合进行处理:
Stream将List转换为Map,使用Collectors.toMap方法进行转换
背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象
1、指定key-value,value是对象中的某个属性值。
Map<Integer,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User::getName));
2、指定key-value,value是对象本身,User->User 是一个返回本身的lambda表达式
Map<Integer,User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId,User->User));
3、指定key-value,value是对象本身,Function.identity()是简洁写法,也是返回对象本身
Map<Integer,User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
4、指定key-value,value是对象本身,Function.identity()是简洁写法,也是返回对象本身,key 冲突的解决办法,这里选择第二个key覆盖第一个key。
Map<Integer,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(key1,key2)->key2));
注意:用Collectors的toMap方法转换List,一般会遇到两个问题。一个是转换map,key重复问题;另一个是空指针异常,即转为map的value是null。
问题解决!!!
一、第一种问题报的错误如下:Duplicate key
使用(key1,key2)->key2表达式可以解决此类问题,如果出现重复的key就使用key2覆盖前面的key1,也可以定义成(key1,key2)->key1,保留key1,根据自己的业务场景来调整。
当使用二个list集合,根据某个值来给你list赋值时,我们之前都是采用双层for循环来实现,现在我们可以使用stream()+lamda表达式来提升效率
实例如下:
首先创建两个对象男生和女生:
// 男生 get set和toString这里省略
public class SchoolBoy {
private String girlId;
private String id;
private String name;
private String grilName;
}
// 女生 get set和toString这里省略
public class Girl {
private String id;
private String name;
}
根据男生对象中的girlId去匹配女生对象并把男生对象的grilName字段赋值
下面展示一个demo
public static void main(String[] args) {
List<SchoolBoy> schoolBoys = new ArrayList<>(3);
SchoolBoy boy1 = new SchoolBoy();
boy1.setGirlId("1");
boy1.setId("10");
boy1.setName("小明");
SchoolBoy boy2 = new SchoolBoy();
boy2.setGirlId("2");
boy2.setId("11");
boy2.setName("小豪");
SchoolBoy boy3 = new SchoolBoy();
boy3.setGirlId("3");
boy3.setId("12");
boy3.setName("小白");
schoolBoys.add(boy1);
schoolBoys.add(boy2);
schoolBoys.add(boy3);
List<Girl> girls = new ArrayList<>(3);
Girl girl1 = new Girl();
girl1.setId("1");
girl1.setName("小英");
Girl girl2 = new Girl();
girl2.setId("2");
girl2.setName("小美");
Girl girl3 = new Girl();
girl3.setId("3");
girl3.setName("小花");
girls.add(girl1);
girls.add(girl2);
girls.add(girl3);
List<SchoolBoy> list = schoolBoys.stream()
.map(schoolBoy -> girls.stream()
.filter(girl -> schoolBoy.getGirlId().equals(girl.getId()))
.findFirst()
.map(girl -> {
schoolBoy.setGrilName(girl.getName());
return schoolBoy;
}).orElse(null))
.collect(Collectors.toList());
System.out.println(list.toString());
}
最后执行的结果:
[SchoolBoy [girlId=1, id=10, name=小明, grilName=小英],
SchoolBoy [girlId=2, id=11, name=小豪, grilName=小美],
SchoolBoy [girlId=3, id=12, name=小白, grilName=小花]]
这个表达式有一个orElse(null)这里要注意一下:通过修改id来出现id没有匹配的话,就返回null,
[SchoolBoy [girlId=1, id=10, name=小明, grilName=小英],
SchoolBoy [girlId=2, id=11, name=小豪, grilName=小美],
null]
少行数据,这样显然不是我们想要的,这里我们做了改成
我们使用orElse(schoolBoy),这样只是不在schoolBoy中设置name值而已。但不至于少一行数据
[SchoolBoy [girlId=1, id=10, name=小明, grilName=小英],
SchoolBoy [girlId=2, id=11, name=小豪, grilName=小美],
SchoolBoy [girlId=3, id=12, name=小白, grilName=null]]
java stream list转map相关推荐
- java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作
一.回顾Stream管道流map的基础用法 最简单的需求:将集合中的每一个字符串,全部转换成大写! List<String> alpha = Arrays.asList("Mon ...
- java stream 遍历map_遍历map的五种方法介绍
日常开发中Map集合遍历是经常使用的,下面介绍几种遍历方法的差异. (推荐教程:java课程) 1.Iterator+entrySet写法[推荐JDK8以下],Map.Entry是Map接口的内部接口 ...
- java Stream map() 案例
1.遍历两个对象 List<Integer> integers1 = List.of(1, 2); List<Integer> integers2 = List.of(3, 2 ...
- java stream中Collectors的用法
文章目录 简介 Collectors.toList() Collectors.toSet() Collectors.toCollection() Collectors.toMap() Collecto ...
- java stream 原理
java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字,然后从中选 ...
- Java Stream ORM现在带有JOIN
Speedment是一个Java Stream ORM工具包和运行时,它使您可以将数据库表作为标准Java Streams查看. 由于不必混合使用Java和SQL,因此该应用程序变得更加紧凑,从而使其 ...
- java stream 分组求和_Java stream List 求和、分组操作
Java stream List 求和.分组操作 前言 项目中经常会使用Stream操作一些集合数据,今天记录一下我经常使用的Stream操作 求和操作public static void main( ...
- java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作
写在开头:本文是转载于掘金上的一篇文章,已获得原作者授权,我会在文章最后放上原作者和原文链接. 前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stre ...
- java Stream 流
java Stream 流 Stream 流 流的创建 流的转化 Optianal 流的计算 Stream 流 1. Stream的定义 来自数据源的支持聚合操作的元素序列. 即一个流对外提供接口,接 ...
- JDK8新特性(十)之Stream流的map和reduce组合使用、mapToInt()、concat()方法
1.Stream流的map和reduce组合使用 假设当前存在Person类,下述两个Person类的需求都是借助Stream流的map()和reduce()方法 import lombok.AllA ...
最新文章
- 违反计算机网络安全如何处罚,网络信息安全知识:违反治安管理行为的处罚包括()。...
- STC15分时内核中函数指针的使用问题
- 自定义注解和拦截器,实现接口限流防刷
- python 导入其他上级目录的模块
- 【消息队列】kafka是如何保证消息不被重复消费的
- 训练日志 2018.11.14
- IP釋放、清除、以及刷新DNS
- Teams 可被滥用于安装恶意软件,微软或不打算修复
- Golang groupcache LRU 缓存简介与用法
- js省市二级联动;)
- 根据TTL值判断目标主机的类型
- 软件测试用例编号命名规则,在TD的测试用例中显示测试用例编号的方法
- 华中农大计算机排名,华中农业大学专业排名,招生专业目录(10篇)
- 小胡时隔两年的第二篇Blog
- 关于canvas的学习心得(三)(计算错误)
- 禁止 input 自动填充
- Java—ISBN号码问题
- alibabaprotect 是危险的有害的顽固的病毒般的存在
- 微信小程序开发——switch组件
- 一文玩转 WebDriver API
热门文章
- php判断电脑还是手机浏览器打开网页,PHP函数判断电脑端浏览器访问访问还是手机端浏览器访问...
- esxi install DS3615XS
- CCA分析图如何解读_微生物群落与环境因子关联:全自动的CCA/RDA分析流程!!...
- 火车头翻译-火车头采集翻译插件使用教程【2022】
- 各种学习资料库,非常好的收藏汇总!!!!!
- COPRA RF 2005 SR1冷弯成型,轧辊设计 USB加密锁
- 关于网页视频下载方法及工具
- 找了个阅读pdf文件语音朗读的软件
- c语言试题库 文库,C语言试题库
- Vue实现户籍管理系统户籍信息的添加与删除