将List分组转成Map是日常开发中常见的需求,我们就来总结一下常见的几种写法。

有如下代码:

@Data
class Person {private String uuid;private String name;private String gender;private int age;public Person(String name, String gender, int age) {this.uuid = UUID.randomUUID().toString();this.name = name;this.gender = gender;this.age = age;}
}

和一个List集合:

List<Person> persons = new ArrayList<>();
persons.add(new Person("张三", "男", 27));
persons.add(new Person("李四", "男", 14));
persons.add(new Person("王五", "女", 17));
persons.add(new Person("赵六", "女", 34));

1. partitioningBy 分两组

partitioningBy要求传入一个Predicate,会按照满足条件和不满足条件分成两组,得到的结果是Map<Boolean, List<T>>结构,比如我们按是否未成年分成两组:

Map<Boolean, List<Person>> personsByAge = persons.stream().collect(Collectors.partitioningBy(p -> p.getAge() > 18));
System.out.println(JSON.toJSONString(personsByAge));

Output:

{false: [{"age": 14,"gender": "男","name": "李四","uuid": "9fc3be98-f676-42a4-9f02-ebdab328103a"}, {"age": 17,"gender": "女","name": "王五","uuid": "3621044d-25a1-4946-a765-57b074f63f26"}],true: [{"age": 27,"gender": "男","name": "张三","uuid": "3f87ec59-29a1-4137-b95b-ae755f0e06ca"}, {"age": 34,"gender": "女","name": "赵六","uuid": "04ed8e9f-545b-49f5-a28b-ce0cccd15663"}]
}

2. groupingBy 分多组

比如按照性别进行分组,得到的是Map<String, List<T>>结构:

Map<String, List<Person>> personByGender = persons.stream().collect(Collectors.groupingBy(Person::getGender));
System.out.println(JSON.toJSONString(personByGender));

Output:

{"女": [{"age": 17,"gender": "女","name": "王五","uuid": "feb8ca82-789f-445e-9e85-c14aa1d70546"}, {"age": 34,"gender": "女","name": "赵六","uuid": "6402b5ec-03cd-45d1-aa6d-7134509ca670"}],"男": [{"age": 27,"gender": "男","name": "张三","uuid": "e2c5ec58-5767-4807-8470-56a016dbc5eb"}, {"age": 14,"gender": "男","name": "李四","uuid": "d10aad57-038b-4ff8-8b36-86045d657c5a"}]
}

3. toMap 自定义<key, value>

前面介绍的partitioningBygroupingBy返回Mapvalue部分都是List<T>结构的,有时我们需要value是对象的一个属性,比如我们想构造一个uuidname的映射,以方便通过uuid快速获取人员的名字:

Map<String, String> uuidNameMap = persons.stream().collect(Collectors.toMap(Person::getUuid, Person::getName));
System.out.println(JSON.toJSONString(uuidNameMap));

Output:

{"7a021022-fa62-4f57-bf33-873b8e030cc3": "王五","e0bad9e6-2c3c-417e-9d27-3b321312421a": "张三","895b0f95-b4fd-481e-ba6c-33f0b636e6cf": "李四","fcb6f403-8489-4853-98c5-6f41341165ba": "赵六"
}

实际情况有可能同一个key会对应多个value,就有可能抛Duplicate key异常。这时可以传入第三个参数决定重复时如何选择,比如我们想构造<name, uuid>的映射,但是考虑可能有重名的可能,就可以这么做:

Map<String, String> nameUuidMap = persons.stream().collect(Collectors.toMap(Person::getName, Person::getUuid, (p1, p2) -> p1));
System.out.println(JSON.toJSONString(nameUuidMap));

这里(p1, p2) -> p1表示如果重复则取前者。

Java lambda表达式实现List转Map相关推荐

  1. java Lambda表达式List快速转Map

    工作经常会遇到list转为map的情况,可能我们只需要某个字段的值转为map集合,在jdk8以前,我们更多地可能会用for循环的方式,然后put到map中去,有了jdk8之后,我们可以使用简单的一句话 ...

  2. Java Lambda表达式入门

    本文转自:http://blog.csdn.net/renfufei... 转载请注明出处 原文链接: Start Using Java Lambda Expressions 下载示例程序 Examp ...

  3. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

  4. Java Lambda表达式初探

    前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...

  5. java lambda表达式 steam api

    java lambda表达式 steam api 案例使用 java版本为 jdk-17 foreach 遍历 public class JavaDemo03 {public static void ...

  6. 【外文翻译】外国友人写得很不错的Java Lambda表达式入门教程,我终于翻译好给大家啦!!!...

    " 英语原文的链接在最底下的"阅读原文" " 简介 (译者认为: 超过 3 行的逻辑就不适用 Lambda 表达式了.虽然看着很先进,其实 Lambda 表达式 ...

  7. Java进阶(五十五)-Java Lambda表达式入门

    原文链接: Start Using Java Lambda Expressions 下载示例程序 Examples.zip . 简介   (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个 ...

  8. Java Lambda表达式入门 1

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53930569 文章出自:薛瑄博客 我对Java 8发布非常激动,尤其是lambda ...

  9. Java Lambda表达式forEach无法跳出循环的解决思路

    Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...

  10. Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记

    Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...

最新文章

  1. cin,getline用法和不同
  2. 关系型数据库全表扫描分片详解
  3. 由一次磁盘告警引发的“血案”——你知道 du 和 ls 区别吗?
  4. protel四层板及内电层分割入门
  5. @WebFilter注解
  6. AD画电路的踩坑点——继电器线圈的正负性以G6K-2F-Y为例
  7. 全球前十大证券交易所在区块链领域的探索和布局
  8. CSDN VIP文章
  9. 四叶草clover配置工具Clover Configurator 5 Ma汉化版
  10. 使用Origin绘制折线图(入门)
  11. 电脑W7系统怎样安装鸿蒙系统,真正纯净版的win7系统
  12. Siamese-RPN论文阅读
  13. phpstudy重置密码登录报错#1045
  14. 实现一个投票小程序全流程
  15. RFID射频识别的解读及应用
  16. 360抢票王验证码自动识别真的那么牛吗?
  17. 浏览器屏蔽百度推广广告
  18. Python生成excel表格并设置样式
  19. mysql 将米换算公里_千米和公里怎么换算
  20. The road you are trudging is bound for loneliness.(前行的道路注定孤独)

热门文章

  1. 入门级Unity安装教程
  2. Android Studio生成APP方法及其所在位置
  3. Unity + Rider + EmmyLua使用中遇到的问题
  4. verilog语法进阶
  5. Multisim BLUE14.0使用介绍
  6. java中字符串逆序_[Java教程]一行代码实现字符串逆序输出
  7. 【matlab笔记】寻找极小值
  8. 论文记载:FRAP:Learning Phase Competition for Traffic Signal Control
  9. zip 的ZipEntry转换为InputStream
  10. 名校计算机课程百度云,浙江大学计算机类专业视频课程百度云网盘