Java lambda表达式实现List转Map
将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>
前面介绍的partitioningBy
和groupingBy
返回Map
的value
部分都是List<T>
结构的,有时我们需要value
是对象的一个属性,比如我们想构造一个uuid
到name
的映射,以方便通过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相关推荐
- java Lambda表达式List快速转Map
工作经常会遇到list转为map的情况,可能我们只需要某个字段的值转为map集合,在jdk8以前,我们更多地可能会用for循环的方式,然后put到map中去,有了jdk8之后,我们可以使用简单的一句话 ...
- Java Lambda表达式入门
本文转自:http://blog.csdn.net/renfufei... 转载请注明出处 原文链接: Start Using Java Lambda Expressions 下载示例程序 Examp ...
- java拉姆达表达式事例,Java Lambda表达式详解和实例
简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...
- Java Lambda表达式初探
前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...
- java lambda表达式 steam api
java lambda表达式 steam api 案例使用 java版本为 jdk-17 foreach 遍历 public class JavaDemo03 {public static void ...
- 【外文翻译】外国友人写得很不错的Java Lambda表达式入门教程,我终于翻译好给大家啦!!!...
" 英语原文的链接在最底下的"阅读原文" " 简介 (译者认为: 超过 3 行的逻辑就不适用 Lambda 表达式了.虽然看着很先进,其实 Lambda 表达式 ...
- Java进阶(五十五)-Java Lambda表达式入门
原文链接: Start Using Java Lambda Expressions 下载示例程序 Examples.zip . 简介 (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个 ...
- Java Lambda表达式入门 1
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53930569 文章出自:薛瑄博客 我对Java 8发布非常激动,尤其是lambda ...
- Java Lambda表达式forEach无法跳出循环的解决思路
Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...
- Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记
Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...
最新文章
- cin,getline用法和不同
- 关系型数据库全表扫描分片详解
- 由一次磁盘告警引发的“血案”——你知道 du 和 ls 区别吗?
- protel四层板及内电层分割入门
- @WebFilter注解
- AD画电路的踩坑点——继电器线圈的正负性以G6K-2F-Y为例
- 全球前十大证券交易所在区块链领域的探索和布局
- CSDN VIP文章
- 四叶草clover配置工具Clover Configurator 5 Ma汉化版
- 使用Origin绘制折线图(入门)
- 电脑W7系统怎样安装鸿蒙系统,真正纯净版的win7系统
- Siamese-RPN论文阅读
- phpstudy重置密码登录报错#1045
- 实现一个投票小程序全流程
- RFID射频识别的解读及应用
- 360抢票王验证码自动识别真的那么牛吗?
- 浏览器屏蔽百度推广广告
- Python生成excel表格并设置样式
- mysql 将米换算公里_千米和公里怎么换算
- The road you are trudging is bound for loneliness.(前行的道路注定孤独)
热门文章
- 入门级Unity安装教程
- Android Studio生成APP方法及其所在位置
- Unity + Rider + EmmyLua使用中遇到的问题
- verilog语法进阶
- Multisim BLUE14.0使用介绍
- java中字符串逆序_[Java教程]一行代码实现字符串逆序输出
- 【matlab笔记】寻找极小值
- 论文记载:FRAP:Learning Phase Competition for Traffic Signal Control
- zip 的ZipEntry转换为InputStream
- 名校计算机课程百度云,浙江大学计算机类专业视频课程百度云网盘