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

  1. java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作

    一.回顾Stream管道流map的基础用法 最简单的需求:将集合中的每一个字符串,全部转换成大写! List<String> alpha = Arrays.asList("Mon ...

  2. java stream 遍历map_遍历map的五种方法介绍

    日常开发中Map集合遍历是经常使用的,下面介绍几种遍历方法的差异. (推荐教程:java课程) 1.Iterator+entrySet写法[推荐JDK8以下],Map.Entry是Map接口的内部接口 ...

  3. java Stream map() 案例

    1.遍历两个对象 List<Integer> integers1 = List.of(1, 2); List<Integer> integers2 = List.of(3, 2 ...

  4. java stream中Collectors的用法

    文章目录 简介 Collectors.toList() Collectors.toSet() Collectors.toCollection() Collectors.toMap() Collecto ...

  5. java stream 原理

    java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字,然后从中选 ...

  6. Java Stream ORM现在带有JOIN

    Speedment是一个Java Stream ORM工具包和运行时,它使您可以将数据库表作为标准Java Streams查看. 由于不必混合使用Java和SQL,因此该应用程序变得更加紧凑,从而使其 ...

  7. java stream 分组求和_Java stream List 求和、分组操作

    Java stream List 求和.分组操作 前言 项目中经常会使用Stream操作一些集合数据,今天记录一下我经常使用的Stream操作 求和操作public static void main( ...

  8. java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作

    写在开头:本文是转载于掘金上的一篇文章,已获得原作者授权,我会在文章最后放上原作者和原文链接. 前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stre ...

  9. java Stream 流

    java Stream 流 Stream 流 流的创建 流的转化 Optianal 流的计算 Stream 流 1. Stream的定义 来自数据源的支持聚合操作的元素序列. 即一个流对外提供接口,接 ...

  10. JDK8新特性(十)之Stream流的map和reduce组合使用、mapToInt()、concat()方法

    1.Stream流的map和reduce组合使用 假设当前存在Person类,下述两个Person类的需求都是借助Stream流的map()和reduce()方法 import lombok.AllA ...

最新文章

  1. 违反计算机网络安全如何处罚,网络信息安全知识:违反治安管理行为的处罚包括()。...
  2. STC15分时内核中函数指针的使用问题
  3. 自定义注解和拦截器,实现接口限流防刷
  4. python 导入其他上级目录的模块
  5. 【消息队列】kafka是如何保证消息不被重复消费的
  6. 训练日志 2018.11.14
  7. IP釋放、清除、以及刷新DNS
  8. Teams 可被滥用于安装恶意软件,微软或不打算修复
  9. Golang groupcache LRU 缓存简介与用法
  10. js省市二级联动;)
  11. 根据TTL值判断目标主机的类型
  12. 软件测试用例编号命名规则,在TD的测试用例中显示测试用例编号的方法
  13. 华中农大计算机排名,华中农业大学专业排名,招生专业目录(10篇)
  14. 小胡时隔两年的第二篇Blog
  15. 关于canvas的学习心得(三)(计算错误)
  16. 禁止 input 自动填充
  17. Java—ISBN号码问题
  18. alibabaprotect 是危险的有害的顽固的病毒般的存在
  19. 微信小程序开发——switch组件
  20. 一文玩转 WebDriver API

热门文章

  1. php判断电脑还是手机浏览器打开网页,PHP函数判断电脑端浏览器访问访问还是手机端浏览器访问...
  2. esxi install DS3615XS
  3. CCA分析图如何解读_微生物群落与环境因子关联:全自动的CCA/RDA分析流程!!...
  4. 火车头翻译-火车头采集翻译插件使用教程【2022】
  5. 各种学习资料库,非常好的收藏汇总!!!!!
  6. COPRA RF 2005 SR1冷弯成型,轧辊设计 USB加密锁
  7. 关于网页视频下载方法及工具
  8. 找了个阅读pdf文件语音朗读的软件
  9. c语言试题库 文库,C语言试题库
  10. Vue实现户籍管理系统户籍信息的添加与删除