目录

1. list转化map基本操作

id最常用方式:

-> 01  key-value值形式:

-> 02 id-> 对象本身

-> 03 id-> 对象本身的 lambda写法

->04  解决冲突的key

2. list计算操作

3. list转化泛型操作

4. List转成map的进阶操作

->4.1  有实体类的进阶操作(常用)

--->准备工作01 :  基础数据(User实体类)

--->4.1.1:  (1对1关系) 分组: 用户名-> 用户实体类对象User(String->T)

--->4.1.2  (1对1关系) 用户名 -> 电话号(String-> String)

--->4.1.301:  (1对多) 分组01: 根据年龄分组  Integer-> List

--->4.1.302:  (1对多) 分组01: 根据年龄分组  Integer-> List 方法二

--->4.1.4:  (1对多) 分组 根据年龄分出 年龄-> 用户 Integer -> List

-> 4.2 没有实体类的进阶操作

[待续未完....时间有限]

-> 5. 总结: 4整个的main方法

-> 5..1 不啰嗦 直接上代码


1. list转化map基本操作

id最常用方式:

-> 01  key-value值形式:

Map<Integer,String>map = list.stream().collect(Collectors.toMap(User::getId,User::getRealName))

-> 02 id-> 对象本身

 Map<Integer,User> userMap3 = list.stream().collect(Collectors.toMap(User::getId, Function.identity()));

-> 03 id-> 对象本身的 lambda写法

Map<Integer,User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId,User->User));

->04  解决冲突的key

Map<Integer,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(key1,key2)->key2));

2. list计算操作

List<Long> testList = new ArrayList<>(Collections.nCopies(5, 0L));testList.set(0,1L);testList.set(1,2L);testList.set(2,3L);testList.set(3,4L);testList.set(4,5L);System.out.println("sum1 is " + testList.stream().reduce(0L, (a, b) -> a + b));// reduce根据初始值(参数1)和累积函数(参数2)依次对数据流进行操作,第一个值与初始值送入累积函数,后面计算结果和下一个数据流依次送入累积函数。System.out.println("sum2 is " + testList.stream().reduce(0L, Long::sum));System.out.println("sum3 is " + testList.stream().collect(Collectors.summingLong(Long::longValue)));// Collectors.summingLong()将流中所有元素视为Long类型,并计算所有元素的总和System.out.println("sum4 is " + testList.stream().mapToLong(Long::longValue).sum());System.out.println("***********************");List<Person> testList1 = new ArrayList<>(Collections.nCopies(5, new Person(1)));System.out.println("class sum1 is " + testList1.stream().map(e -> e.getAge()).reduce(0, (a,b) -> a + b));System.out.println("class sum2 is " + testList1.stream().map(e -> e.getAge()).reduce(0, Integer::sum));System.out.println("class sum3 is " + testList1.stream().collect(Collectors.summingInt(Person::getAge)));System.out.println("class sum4 is " + testList1.stream().map(e -> e.getAge()).mapToInt(Integer::intValue).sum());

3. list转化泛型操作

            List<User> list = userMapper.selectUserMessage(null);List<UserRespDTO> collect = list.stream().map(dto-> {UserRespDTO userRespDTO = new UserRespDTO();BeanUtils.copyProperties(dto, respDTO);return userRespDTO;}).collect(Collectors.toList());

4. List转成map的进阶操作

->4.1  有实体类的进阶操作(常用)

--->准备工作01 :  基础数据(User实体类)

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.util.Date;/*** 模拟用户实体类对象** @author pzy* @version 0.1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User {private String username;private Integer age;private String telephone;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date createTime;}

---> 准备工作02:

//1. 创建基础数据List<User> list = new ArrayList<>();User user1 = new User("张三", 33, "13345678913", new Date());User user2 = new User("李四", 44, "13345678914", new Date());User user3 = new User("王五", 55, "13345678915", new Date());User user4 = new User("李六", 55, "13345678916", new Date());list.add(user1);list.add(user2);list.add(user3);list.add(user4);

--->4.1.1:  (1对1关系) 分组: 用户名-> 用户实体类对象User(String->T)

Map<String, User> map1 = list.stream().collect(Collectors.toMap(User::getUsername, each -> each, (value1, value2) -> value1));System.out.println(JSON.toJSONString(map1));

//{"李四":{"age":44,"createTime":1679536527360,"telephone":"13345678914","username":"李四"},"张三":{"age":33,"createTime":1679536527360,"telephone":"13345678913","username":"张三"},"李六":{"age":55,"createTime":1679536527360,"telephone":"13345678916","username":"李六"},"王五":{"age":55,"createTime":1679536527360,"telephone":"13345678915","username":"王五"}}

--->4.1.2  (1对1关系) 用户名 -> 电话号(String-> String)

  Map<String,String> map2 =  list.stream().collect(Collectors.toMap(User::getUsername,User::getTelephone,(value1, value2) -> value1));System.out.println(JSON.toJSONString(map2));

//{"李四":"13345678914","张三":"13345678913","李六":"13345678916","王五":"13345678915"}

--->4.1.301:  (1对多) 分组01: 根据年龄分组  Integer-> List<T>

Map<Integer, List<User>> map301 = list.stream().collect(Collectors.groupingBy(User::getAge));System.out.println(JSON.toJSONString(map301));
//{33:[{"age":33,"createTime":1679536527360,"telephone":"13345678913","username":"张三"}],55:[{"age":55,"createTime":1679536527360,"telephone":"13345678915","username":"王五"},{"age":55,"createTime":1679536527360,"telephone":"13345678916","username":"李六"}],44:[{"age":44,"createTime":1679536527360,"telephone":"13345678914","username":"李四"}]}

--->4.1.302:  (1对多) 分组01: 根据年龄分组  Integer-> List<T> 方法二

Map<Integer,List<User>> map302 =  list.stream().collect(Collectors.toMap(User::getAge, Collections::singletonList,(value1, value2) -> {List<User> union = new ArrayList<>(value1);union.addAll(value2);return union;}));System.out.println(JSON.toJSONString(map302));
//{33:[{"age":33,"createTime":1679536527360,"telephone":"13345678913","username":"张三"}],55:[{"age":55,"createTime":1679536527360,"telephone":"13345678915","username":"王五"},{"age":55,"createTime":1679536527360,"telephone":"13345678916","username":"李六"}],44:[{"age":44,"createTime":1679536527360,"telephone":"13345678914","username":"李四"}]}

--->4.1.4:  (1对多) 分组 根据年龄分出 年龄-> 用户 Integer -> List<String>

业务: 想查看每个年龄下都有谁(姓名即可)

Map<Integer,List<String>> map4 = list.stream().collect(Collectors.toMap(User::getAge,each->Collections.singletonList(each.getUsername()),(value1, value2) -> {List<String> usernameList = new ArrayList<>(value1);usernameList.addAll(value2);return usernameList;}));System.out.println(JSON.toJSONString(map4));
//{33:["张三"],55:["王五","李六"],44:["李四"]}

-> 4.2 没有实体类的进阶操作

[待续未完....时间有限]


-> 5. 总结: 4整个的main方法

-> 5..1 不啰嗦 直接上代码

 public static void main(String[] args) {//1. 创建基础数据List<User> list = new ArrayList<>();User user1 = new User("张三", 33, "13345678913", new Date());User user2 = new User("李四", 44, "13345678914", new Date());User user3 = new User("王五", 55, "13345678915", new Date());User user4 = new User("李六", 55, "13345678916", new Date());list.add(user1);list.add(user2);list.add(user3);list.add(user4);/*1. (1对1关系) 分组:  用户名-> 用户实体类对象User*/Map<String, User> map1 = list.stream().collect(Collectors.toMap(User::getUsername, each -> each, (value1, value2) -> value1));System.out.println(JSON.toJSONString(map1));//{"李四":{"age":44,"createTime":1679536527360,"telephone":"13345678914","username":"李四"},"张三":{"age":33,"createTime":1679536527360,"telephone":"13345678913","username":"张三"},"李六":{"age":55,"createTime":1679536527360,"telephone":"13345678916","username":"李六"},"王五":{"age":55,"createTime":1679536527360,"telephone":"13345678915","username":"王五"}}/*2. (1对1关系) 用户名 -> 电话号 */Map<String,String> map2 =  list.stream().collect(Collectors.toMap(User::getUsername,User::getTelephone,(value1, value2) -> value1));System.out.println(JSON.toJSONString(map2));//{"李四":"13345678914","张三":"13345678913","李六":"13345678916","王五":"13345678915"}/*301. (1对多关系) 分组01:  根据年龄分组  目的: 将年龄相等的进行分组 年龄->用户实体类 */Map<Integer, List<User>> map301 = list.stream().collect(Collectors.groupingBy(User::getAge));System.out.println(JSON.toJSONString(map301));//{33:[{"age":33,"createTime":1679536527360,"telephone":"13345678913","username":"张三"}],55:[{"age":55,"createTime":1679536527360,"telephone":"13345678915","username":"王五"},{"age":55,"createTime":1679536527360,"telephone":"13345678916","username":"李六"}],44:[{"age":44,"createTime":1679536527360,"telephone":"13345678914","username":"李四"}]}/*302. (1对多关系) 分组02:  根据年龄分组  目的: 将年龄相等的进行分组 年龄->用户实体类 */Map<Integer,List<User>> map302 =  list.stream().collect(Collectors.toMap(User::getAge, Collections::singletonList,(value1, value2) -> {List<User> union = new ArrayList<>(value1);union.addAll(value2);return union;}));System.out.println(JSON.toJSONString(map302));//{33:[{"age":33,"createTime":1679536527360,"telephone":"13345678913","username":"张三"}],55:[{"age":55,"createTime":1679536527360,"telephone":"13345678915","username":"王五"},{"age":55,"createTime":1679536527360,"telephone":"13345678916","username":"李六"}],44:[{"age":44,"createTime":1679536527360,"telephone":"13345678914","username":"李四"}]}/*4. (1对多关系) 分组 根据年龄分出 年龄-> 用户 业务: 想查看每个年龄下都有谁(姓名即可)*/Map<Integer,List<String>> map4 = list.stream().collect(Collectors.toMap(User::getAge,each->Collections.singletonList(each.getUsername()),(value1, value2) -> {List<String> usernameList = new ArrayList<>(value1);usernameList.addAll(value2);return usernameList;}));System.out.println(JSON.toJSONString(map4));//{33:["张三"],55:["王五","李六"],44:["李四"]}}

创作不易, 点个赞再走呗~~~

[进阶] list 过滤 stream 的lambda进阶操作, 这一篇就够了相关推荐

  1. 【Java 8系列】Stream详解,看这一篇就够啦

    热门系列: [Java 8系列]收集器Collector与工具类Collectors [Java 8系列]Lambda 表达式,一看就废 [Java 8系列]Java日期时间的新主宰者:LocalDa ...

  2. ❤️学懂C语言文件操作读这篇就够了(万字总结,附习题)❤️

    目录 ​​​ 一,写在前面 二,为什么使用文件 1,原因 2,数据流 3,缓冲区(Buffer) 4,C语言中带缓冲区的文件处理 5,文件类型 6,文件存取方式 三,什么是文件 1,程序文件 2,数据 ...

  3. docker停止容器后配置_整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划...

    作者 | IronmanJay 责编 | 王晓曼 出品 | CSDN博客 Docker 基础介绍 下图为 Docker 图标(是一个鲸鱼上面是集装箱). 1.我们为什么要使用Docker 当我们在工作 ...

  4. 整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划

    作者 | IronmanJay 责编 | 王晓曼 出品 | CSDN博客 Docker 基础介绍 下图为 Docker 图标(是一个鲸鱼上面是集装箱). 1.我们为什么要使用Docker 当我们在工作 ...

  5. Linux常用命令(日常操作这一篇就够了)

    文章目录 **一.查看资源信息** **1)查看系统运行资源** **查看内存使用量和交换区使用量** **查看各分区情况** **查看指定目录大小** **查看系统运行时间.用户数.负载** **2 ...

  6. Java进阶知识 —— Java8 Stream语法

    前言: 讲Stream之前,先来用个小需求带入本文.毕竟代码看的最清楚. 正文: 项目某个页面有个需求,将关键词和集合比对,判断是否存在关键词,这种需求想必是再普通不过,最简单的就是循环迭代了. 上来 ...

  7. Java基础巩固(二)异常,多线程,线程池,IO流,Properties集合,IO工具类,字符流,对象流,Stream,Lambda表达式

    一.异常,多线程 学习目标 : 异常的概述 异常的分类 异常的处理方式 自定义异常 多线程入门 1 异常的概述 1.1 什么是异常? 异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程 ...

  8. 5万字长文:Stream和Lambda表达式最佳实践-附PDF下载

    文章目录 1. Streams简介 1.1 创建Stream 1.2 Streams多线程 1.3 Stream的基本操作 Matching Filtering Mapping FlatMap Red ...

  9. java8新特性 Stream流的优雅操作

    1. 使用传统的方式,遍历集合,对集合中的数据进行过滤 //创建一个List集合,存储姓名List<String> list = new ArrayList<>();list. ...

最新文章

  1. jsp内置对象application
  2. html5 loader,7种基于GSAP的SVG Loader加载动画特效
  3. Qt Linguist 翻译
  4. android app两种调试方法
  5. 面向对象思想----不看懊悔!
  6. elasticsearch数据备份还原
  7. mysql语句中多表查询_6.MySql中的SQL语句(五):多表查询
  8. VC++6.0选择打开文件命令时停止工作解决方法
  9. extern 头文件 定义声明
  10. linq分类汇总怎么写_包围结构的字怎么写才好看?掌握方法是关键,分类总结要领很实用...
  11. 四、ASP文件的基本格式及新建方法
  12. 计算机导论课程知识总结,计算机导论课程论文范文
  13. Photoshop CS 5 注册方法
  14. Python实现Singleton模式的几种方式
  15. java jimi_Java开源工具Jimi处理图片大小及格式转换
  16. react-native >0.69版本 链接@ant-design/icons-react-native
  17. Hyper-v集群高可用性配置
  18. 视频文件头解析--MP4-获取mp4 文件信息
  19. 关于 Linux中逻辑卷/物理分区等知识的一些总结
  20. 如何应对大促?看京东核心中间件团队的高可用实践指南

热门文章

  1. 【SDX12】sdx12增加dscp支持及设置SIP的RTP/RTCP为CS5(即0x28=40)操作说明
  2. 原创视频批量添加片头片尾的方法
  3. 【小Y学算法】⚡️每日LeetCode打卡⚡️——43. 两数之和 II - 输入有序数组
  4. WPS表格查找替换技巧:让你的工作效率翻倍
  5. 你值得掌握的Windows热键——原来高手都是这样玩电脑的!
  6. Android Bitmap详解
  7. mysql 默认值 now_mysql设置datetime默认值为now
  8. MySQL修改字段的默认值和空值
  9. 新国都一面 Java
  10. iptables规则总结