• 我们有一个用户信息类

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

  1. java8流分组 性能_Java性能教程– Java 8流有多快?

    java8流分组 性能 在此JAX Magazine的预览预览中,JAX伦敦发言人Angelika Langer为使用Java流的任何人回答了最重要的问题:它们真的更快吗? Java 8是JDK收集框 ...

  2. java map合并_详解Java8合并两个Map中元素的正确姿势

    1. 介绍 本入门教程将介绍Java8中如何合并两个map. 更具体说来,我们将研究不同的合并方案,包括Map含有重复元素的情况. 2. 初始化 我们定义两个map实例 private static ...

  3. 简易的动物园管理系统之Java8流式API的重构代码(使用 门面设计模式)

    文章目录 前言 之前的文章 本次的源码 AnimalTypeEnum SexEnum Animal AnimalFactory BaseAnimal Bird Cat Dog Fish AddAnim ...

  4. 关于日常开发Java8流处理max()随笔

    Stream字节流接口max方法,需要传入一个Comparator比较器,可看到若没有最大的元素会返回null /*** Returns the maximum element of this str ...

  5. java8 循环map_Java8遍历Map的三种方式——for/stream/forEach

    最近写在基于Spring WebFlux项目遇到一个需求,希望将请求中的cookie/headers/params等信息获取,而获取后的数据结构都是MultiValueMap的数据结构,实质上可以看做 ...

  6. Java8流处理正序倒序排序

    文章目录 1 问题背景 2 分析 3 实现 3.1 单字段排序 3.2 多字段级联排序 1 问题背景 场景是电商查询优惠活动的活动列表,有8种活动.针对搭售类型的活动按照状态正序.优先级倒叙来排序.其 ...

  7. Java8中list转map方法总结

    背景 在最近的工作开发之中,慢慢习惯了很多Java8中的Stream的用法,很方便而且也可以并行的去执行这个流,这边去写一下昨天遇到的一个list转map的场景. list转map在Java8中str ...

  8. java8流_Java8Stream流详解

    对于Stream流可以拆分为3个步骤 1)创建流: 通过数据源(如:集合.数组)获取流 2)处理流:(中的数据) 对流中的数据进行处理(处理是延迟执行的) 3)收集流:(中的数据) 通过调用收集方法, ...

  9. java8流实战-用流收集数据实践简记

    文章目录 收集器简介 什么是流收集器 一个get start告诉你流收集器的强大之处 流收集器工作原理简析 规约和汇总 查找流中的最大值和最小值 汇总和和一次性获取所有规约结果 连接字符串 关于规约汇 ...

  10. java8 流操作_java8中的流操作

    Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素流在管道中经过 ...

最新文章

  1. SAP MM PR单据中采购组为空带来的问题
  2. px word 表格宽度_word怎样批量修改表格的宽度(2)
  3. SpringCloud组件:Eureka的服务发现与消费
  4. 笔记本用无线路由器上网设置教程攻略
  5. 虚拟机安装 服务器 Ubuntu Server20.04.2
  6. SpringBoot开发Restful接口
  7. android怎样判断插入数据是否成功_Android 端 V1/V2/V3 签名的原理
  8. java大数据开发工程师,面试题附答案
  9. 苹果证实将弃用Windows版QuickTime
  10. 【C++】accumulate函数的用法(STL)
  11. python中关于集合的基础运用
  12. 利用SQL建立数据库
  13. c++ new操作符(new operator)、operator new、placement new 、operator new[] 及相对应的delete 操作符、operator delete
  14. 【图像配准】基于matlab SIFT图像配准【含Matlab源码 463期】
  15. Linux下启动jar包不跑日志
  16. 猿创征文|我在人间编程那些年
  17. 【深度学习】手写数字识别Tensorflow2实验报告
  18. TAPA认证辅导,TAPA全球委员会正式发布了《运输供应商最低安全要求》
  19. 本地时间与Web标准时间校对
  20. 用xlwings直接调用excel打开xlsx文件

热门文章

  1. 华擎主板安装linux系统,华擎B365主板安装win7详细步骤
  2. 入门级Unity安装教程
  3. linux 检查ntp版本,查看linux安装ntp服务器配置
  4. 乐优购物学习笔记(5)
  5. MATLAB数值计算
  6. 编码浅析 ASCII EASCII GBK系列 Uincode UTF-8/16/32
  7. C++和ASM文件的互相调用
  8. C语言——PTA 统计素数并求和
  9. 学习笔记:AGPS-SUPL架构
  10. matlab 符号函数 计算,MATLAB符号计算函数用法总结