Java8流List转Map
- 我们有一个用户信息类
通过JAVA8的流操作需要转换成userId为key, name为value的map。
public class User {private Integer userId;private String name;private String email;public User(Integer userId, String name, String email) {this.userId = userId;this.name = name;this.email = email;}public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"userId=" + userId +", name='" + name + ''' +", email='" + email + ''' +'}';} } 复制代码
- 实现代码
public class ListToMap {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User(1, "user1", "email1@demo.com"));users.add(new User(2, "user2", "email2@demo.com"));users.add(new User(3, "user3", "email3@demo.com"));users.add(new User(4, "user4", "email4@demo.com"));Map<Integer, String> userIdAndName = users.stream().collect(Collectors.toMap(User::getUserId, User::getName));System.out.println(userIdAndName);} } 复制代码
输出结果
- userId为key,用户对象为value
public class ListToMap {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User(1, "user1", "email1@demo.com"));users.add(new User(2, "user2", "email2@demo.com"));users.add(new User(3, "user3", "email3@demo.com"));users.add(new User(4, "user4", "email4@demo.com"));Map<Integer, User> userIdAndUser = users.stream().collect(Collectors.toMap(User::getUserId, user-> user));System.out.println(userIdAndUser);} } 复制代码
输出
- 重复的key处理
在转换过程中,如果出现相同的key,那么会抛出重复key的异常。
我们将userId为3的修改为2,和第二个用户冲突
Collectors.toMap支持第三个参数,对重复值进行选取
public class ListToMap {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User(1, "user1", "email1@demo.com"));users.add(new User(2, "user2", "email2@demo.com"));users.add(new User(2, "user3", "email3@demo.com"));users.add(new User(4, "user4", "email4@demo.com"));Map<Integer, User> userIdAndUser = users.stream().collect(Collectors.toMap(User::getUserId, user-> user, (oldValue, newValue) -> newValue));System.out.println(userIdAndUser);} } 复制代码
选取新的值覆盖旧的值,得到的结果
只会出现user3,而user2被覆盖掉了。
- 将ID和用户列表进行映射
刚才上面出现重复的ID,是根据值进行覆盖,如果在某些情况下需要映射成列表。
即:List -> Map<Integer, List>的情况
这需要使用到groupingBy
public class ListToMap {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User(1, "user1", "email1@demo.com"));users.add(new User(2, "user2", "email2@demo.com"));users.add(new User(2, "user3", "email3@demo.com"));users.add(new User(4, "user4", "email4@demo.com"));Map<Integer, List<User>> userMap = users.stream().collect(Collectors.groupingBy(User::getUserId));System.out.println(userMap);} } 复制代码
ID为2的出现多条数据。
- 指定Map类型
Collectors.toMap支持第四个参数,对map类型进行实例化
public class ListToMap {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User(1, "user1", "email1@demo.com"));users.add(new User(2, "user2", "email2@demo.com"));users.add(new User(3, "user3", "email3@demo.com"));users.add(new User(4, "user4", "email4@demo.com"));Map<Integer, User> userIdAndUser = users.stream().collect(Collectors.toMap(User::getUserId, user-> user, (oldValue, newValue) -> newValue, ConcurrentHashMap::new));System.out.println(userIdAndUser);System.out.println(userIdAndUser.getClass());} } 复制代码
输出
userIdAndUser类的类型是ConcurrentHashMap
Java8流List转Map相关推荐
- java8流分组 性能_Java性能教程– Java 8流有多快?
java8流分组 性能 在此JAX Magazine的预览预览中,JAX伦敦发言人Angelika Langer为使用Java流的任何人回答了最重要的问题:它们真的更快吗? Java 8是JDK收集框 ...
- java map合并_详解Java8合并两个Map中元素的正确姿势
1. 介绍 本入门教程将介绍Java8中如何合并两个map. 更具体说来,我们将研究不同的合并方案,包括Map含有重复元素的情况. 2. 初始化 我们定义两个map实例 private static ...
- 简易的动物园管理系统之Java8流式API的重构代码(使用 门面设计模式)
文章目录 前言 之前的文章 本次的源码 AnimalTypeEnum SexEnum Animal AnimalFactory BaseAnimal Bird Cat Dog Fish AddAnim ...
- 关于日常开发Java8流处理max()随笔
Stream字节流接口max方法,需要传入一个Comparator比较器,可看到若没有最大的元素会返回null /*** Returns the maximum element of this str ...
- java8 循环map_Java8遍历Map的三种方式——for/stream/forEach
最近写在基于Spring WebFlux项目遇到一个需求,希望将请求中的cookie/headers/params等信息获取,而获取后的数据结构都是MultiValueMap的数据结构,实质上可以看做 ...
- Java8流处理正序倒序排序
文章目录 1 问题背景 2 分析 3 实现 3.1 单字段排序 3.2 多字段级联排序 1 问题背景 场景是电商查询优惠活动的活动列表,有8种活动.针对搭售类型的活动按照状态正序.优先级倒叙来排序.其 ...
- Java8中list转map方法总结
背景 在最近的工作开发之中,慢慢习惯了很多Java8中的Stream的用法,很方便而且也可以并行的去执行这个流,这边去写一下昨天遇到的一个list转map的场景. list转map在Java8中str ...
- java8流_Java8Stream流详解
对于Stream流可以拆分为3个步骤 1)创建流: 通过数据源(如:集合.数组)获取流 2)处理流:(中的数据) 对流中的数据进行处理(处理是延迟执行的) 3)收集流:(中的数据) 通过调用收集方法, ...
- java8流实战-用流收集数据实践简记
文章目录 收集器简介 什么是流收集器 一个get start告诉你流收集器的强大之处 流收集器工作原理简析 规约和汇总 查找流中的最大值和最小值 汇总和和一次性获取所有规约结果 连接字符串 关于规约汇 ...
- java8 流操作_java8中的流操作
Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素流在管道中经过 ...
最新文章
- SAP MM PR单据中采购组为空带来的问题
- px word 表格宽度_word怎样批量修改表格的宽度(2)
- SpringCloud组件:Eureka的服务发现与消费
- 笔记本用无线路由器上网设置教程攻略
- 虚拟机安装 服务器 Ubuntu Server20.04.2
- SpringBoot开发Restful接口
- android怎样判断插入数据是否成功_Android 端 V1/V2/V3 签名的原理
- java大数据开发工程师,面试题附答案
- 苹果证实将弃用Windows版QuickTime
- 【C++】accumulate函数的用法(STL)
- python中关于集合的基础运用
- 利用SQL建立数据库
- c++ new操作符(new operator)、operator new、placement new 、operator new[] 及相对应的delete 操作符、operator delete
- 【图像配准】基于matlab SIFT图像配准【含Matlab源码 463期】
- Linux下启动jar包不跑日志
- 猿创征文|我在人间编程那些年
- 【深度学习】手写数字识别Tensorflow2实验报告
- TAPA认证辅导,TAPA全球委员会正式发布了《运输供应商最低安全要求》
- 本地时间与Web标准时间校对
- 用xlwings直接调用excel打开xlsx文件