当前位置:   article > 正文

Java - Lambda List 转 Map 几种方式_lamda list转map

lamda list转map

故事背景

我们平时在项目中经常会遇到 List 转 Map 的情况,但是传统的方式又显得太臃肿,于是就想到 Lambda 神器,今天我们就来看看都有哪几种转换方式(List -> Map)

公共代码

  1. // Person 实体类
  2. @Data
  3. class Person {
  4. private String uuid;
  5. private String name;
  6. private String gender;
  7. private int age;
  8. public Person(String name, String gender, int age) {
  9. this.uuid = UUID.randomUUID().toString();
  10. this.name = name;
  11. this.gender = gender;
  12. this.age = age;
  13. }
  14. }
  15. // List 集合
  16. List<Person> persons = new ArrayList<>();
  17. persons.add(new Person("张三", "男", 27));
  18. persons.add(new Person("李四", "男", 14));
  19. persons.add(new Person("王五", "女", 17));
  20. persons.add(new Person("赵六", "女", 34));

方式一(partitioningBy 分两组)

  • partitioningBy要求传入一个Predicate,会按照满足条件和不满足条件分成两组,得到的结果是Map<Boolean, List<T>>结构,比如我们按是否未成年分成两组
  1. Map<Boolean, List<Person>> personsByAge = persons.stream()
  2. .collect(Collectors.partitioningBy(p -> p.getAge() > 18));
  3. System.out.println(JSON.toJSONString(personsByAge));
  4. // 输出
  5. {
  6. false: [{
  7. "age": 14,
  8. "gender": "男",
  9. "name": "李四",
  10. "uuid": "9fc3be98-f676-42a4-9f02-ebdab328103a"
  11. }, {
  12. "age": 17,
  13. "gender": "女",
  14. "name": "王五",
  15. "uuid": "3621044d-25a1-4946-a765-57b074f63f26"
  16. }],
  17. true: [{
  18. "age": 27,
  19. "gender": "男",
  20. "name": "张三",
  21. "uuid": "3f87ec59-29a1-4137-b95b-ae755f0e06ca"
  22. }, {
  23. "age": 34,
  24. "gender": "女",
  25. "name": "赵六",
  26. "uuid": "04ed8e9f-545b-49f5-a28b-ce0cccd15663"
  27. }]
  28. }

方式二(groupingBy 分多组)

  • 比如按照性别进行分组,得到的是Map<String, List<T>>结构
  1. Map<String, List<Person>> personByGender = persons.stream()
  2. .collect(Collectors.groupingBy(Person::getGender));
  3. System.out.println(JSON.toJSONString(personByGender));
  4. // 输出
  5. {
  6. "女": [{
  7. "age": 17,
  8. "gender": "女",
  9. "name": "王五",
  10. "uuid": "feb8ca82-789f-445e-9e85-c14aa1d70546"
  11. }, {
  12. "age": 34,
  13. "gender": "女",
  14. "name": "赵六",
  15. "uuid": "6402b5ec-03cd-45d1-aa6d-7134509ca670"
  16. }],
  17. "男": [{
  18. "age": 27,
  19. "gender": "男",
  20. "name": "张三",
  21. "uuid": "e2c5ec58-5767-4807-8470-56a016dbc5eb"
  22. }, {
  23. "age": 14,
  24. "gender": "男",
  25. "name": "李四",
  26. "uuid": "d10aad57-038b-4ff8-8b36-86045d657c5a"
  27. }]
  28. }

方式三(toMap 自定义<Key, Value>)

  • 前面介绍的partitioningBy和groupingBy返回Map的value部分都是List<T>结构的,有时我们需要value是对象的一个属性,比如我们想构造一个uuid到name的映射,以方便通过uuid快速获取人员的名字
  1. Map<String, String> uuidNameMap = persons.stream()
  2. .collect(Collectors.toMap(Person::getUuid, Person::getName));
  3. System.out.println(JSON.toJSONString(uuidNameMap));
  4. // 输出
  5. {
  6. "7a021022-fa62-4f57-bf33-873b8e030cc3": "王五",
  7. "e0bad9e6-2c3c-417e-9d27-3b321312421a": "张三",
  8. "895b0f95-b4fd-481e-ba6c-33f0b636e6cf": "李四",
  9. "fcb6f403-8489-4853-98c5-6f41341165ba": "赵六"
  10. }
  • 实际情况有可能同一个key会对应多个value,就有可能抛Duplicate key异常。这时可以传入第三个参数决定重复时如何选择,比如我们想构造<name, uuid>的映射,但是考虑可能有重名的可能,就可以这么做(Tips:这里(p1, p2) -> p1表示如果重复则取前者)
  1. Map<String, String> nameUuidMap = persons.stream()
  2. .collect(Collectors.toMap(Person::getName, Person::getUuid, (p1, p2) -> p1));
  3. System.out.println(JSON.toJSONString(nameUuidMap));
  • 附加: 如何呈现 <Person::getName, Person> 这种数据结构呢?
  1. Map<String, Person> namePersonMap = persons.stream()
  2. .collect(Collectors.toMap(Person::getName, v -> v, (p1, p2) -> p1));
  3. System.out.println(JSON.toJSONString(namePersonMap));
  • 是不是看着很繁琐,特别是第 2、3 参数…… 当然也有一种简写方式(推荐)
  1. Map<String, Person> namePersonMap = persons.stream()
  2. .collect(Collectors.toMap(Person::getName, Function.identity()));
  3. System.out.println(JSON.toJSONString(namePersonMap));
  1. Map<String, Person> namePersonMap = persons.stream()
  2. .collect(Collectors.toMap(person -> person.getName(), Function.identity()));
  3. System.out.println(JSON.toJSONString(namePersonMap));
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/891832
推荐阅读
相关标签
  

闽ICP备14008679号