Java中List常用操作比for循环更优雅的写法示例
作者:Mr泰迪 发布时间:2023-08-08 23:25:14
目录
引言
简单遍历
筛选符合某属性条件的List集合
获取某属性返回新的List集合
获取以某属性为key,其他属性或者对应对象为value的Map集合
以某个属性进行分组的Map集合
其他情况
总结
引言
使用JDK1.8之后,大部分list的操作都可以使用lambda表达式去写,可以让代码更简洁,开发更迅速。以下是我在工作中常用的lambda表达式对list的常用操作,喜欢建议收藏。
以用户表为例,用户实体代码如下:
public class User {
private Integer id; //id
private String name; //姓名
private Integer age; //年龄
private Integer departId; //所属部门id
}
List<User> list = new ArrayList<>();
简单遍历
使用lambda表达式之前,如果需要遍历list时,一般使用增强for循环,代码如下:
List<User> list = new ArrayList<>();
for (User u:list) {
System.out.println(u.toString());
}
使用lambda表达式之后,可以缩短为一行代码:
list.forEach(u-> System.out.println(u.toString()));
筛选符合某属性条件的List集合
以筛选年龄在15-17之间的用户为例,for循环写法为:
List<User> users = new ArrayList<>();
for (User u : list) {
if (u.getAge() >= 15 && u.getAge() <= 17) {
users.add(u);
}
}
使用lambda表达式写法为:
List<User> users = list.stream()
.filter(u -> u.getAge() >= 15 && u.getAge() <= 17)
.collect(Collectors.toList());
获取某属性返回新的List集合
以获取id为例,项目中有时候可能会需要根据用户id的List进行查询或者批量更新操作,这时候就需要用户id的List集合,for循环写法为:
List<Integer> ids = new ArrayList<>();
for (User u:list) {
ids.add(u.getId());
}
lambda表达式写法为:
List<User> users = list.stream()
.filter(u -> u.getAge() >= 15 && u.getAge() <= 17)
.collect(Collectors.toList());
获取以某属性为key,其他属性或者对应对象为value的Map集合
以用户id为key(有时可能需要以用户编号为key),以id对应的user作为value构建Map集合,for循环写法为:
Map<Integer,User> userMap = new HashMap<>();
for (User u:list) {
if (!userMap.containsKey(u.getId())){
userMap.put(u.getId(),u);
}
}
lambda表达式写法为:
Map<Integer,User> map = list.stream()
.collect(Collectors.toMap(User::getId,
Function.identity(),
(m1,m2)->m1));
Function.identity()返回一个输出跟输入一样的Lambda表达式对象,等价于形如t -> t形式的Lambda表达式。
(m1,m2)-> m1此处的意思是当转换map过程中如果list中有两个相同id的对象,则map中存放的是第一个对象,此处可以根据项目需要自己写。
以某个属性进行分组的Map集合
以部门id为例,有时需要根据部门分组,筛选出不同部门下的人员,如果使用for循环写法为:
Map<Integer,List<User>> departGroupMap = new HashMap<>();
for (User u:list) {
if (departGroupMap.containsKey(u.getDepartId())){
departGroupMap.get(u.getDepartId()).add(u);
}else {
List<User> users1 = new ArrayList<>();
users1.add(u);
departGroupMap.put(u.getDepartId(),users1);
}
}
使用lambda表达式写法为:
Map<Integer,List<User>> departGroupMap = list.stream()
.collect(Collectors
.groupingBy(User::getDepartId));
其他情况
可以根据需要结合stream()进行多个操作,比如筛选出年龄在15-17岁的用户,并且根据部门进行分组分组,如果使用for循环,代码如下:
Map<Integer,List<User>> departGroupMap = new HashMap<>();
for (User u:list) {
if (u.getAge() >= 15 && u.getAge() <= 17) {
if (departGroupMap.containsKey(u.getDepartId())){
departGroupMap.get(u.getDepartId()).add(u);
}else {
List<User> users1 = new ArrayList<>();
users1.add(u);
departGroupMap.put(u.getDepartId(),users1);
}
}
}
使用lambda表达式,代码如下:
Map<Integer,List<User>> departGroupMap = list.stream()
.filter(u->u.getAge() >= 15 && u.getAge() <= 17)
.collect(Collectors.groupingBy(User::getDepartId));
总结
上述部分是小编在工作中遇到的常用的单个List的操作,可能在项目中还会遇到更复杂的场景,可以根据需要进行多个方法的组合使用,我的感觉是使用lambda表达式代码更加简洁明了,当然各人有各人的编码习惯,不喜勿喷。
来源:https://juejin.cn/post/7023760357407916063


猜你喜欢
- 纸上得来终觉浅,觉知此事要躬行。楔子本文适合:对Spring Security有一点了解或者跑过简单demo但是对整体运行流程不明白的同学,
- 本文实例为大家分享了java实现文件夹解压和压缩的具体代码,供大家参考,具体内容如下效果实现多个文件以及文件夹的压缩和解压代码分析impor
- 具体实现方式不多说了,请看下文一、前言当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,
- RequestBody注解的List参数传递Controller方法参数:@RequestBody List<Long> ids
- 本文演示以Spark作为分析引擎,Cassandra作为数据存储,而使用Spring Boot来开发驱动程序的示例。1.前置条件安装Spar
- 这篇文章主要介绍了Java方法重载Overload原理及使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 前言研究表明,Java堆中对象占据最大比重的就是字符串对象,所以弄清楚字符串知识很重要,本文主要重点聊聊字符串常量池。Java中的字符串常量
- 本文汇总了常用的DateTime日期类型格式化显示方法,方便读者在使用的时候参考借鉴一下。具体如下所示:1.绑定时格式化日期方法:<A
- 本文实例讲述了Android编程应用风格和主题。分享给大家供大家参考,具体如下:当你设计你的程序的时候,你可以用风格和主题来统一格式化各种屏
- 不记得从哪找的了,修改了部分代码,修复在Android平台下使用时,时区时间格式异常的问题。package cn.aikongmeng.de
- 1. LongAdder和AtomicLong类似的使用方式,但是性能比AtomicLong更好。LongAdder与AtomicLong都
- 最近做项目有这样的需求: 在activity中启动一个dialog时, 启动的dialog的背景设为启动acitivity的模糊化图片.实现
- 有看过我之前发表过的C#相关文章分享和阅读过我代码的朋友们可能会在我的代码里面经常看到各种各样的λ表达式动态拼接,C#
- 基于SSM+Mysql+Maven+HTML实现的员工绩效管理系统。该系统只有后台页面,后台前端框架使用的是layui官网推荐后台界面。角色
- java与scala数组及集合的操作这篇博客介绍了scala的数组 + 可变数组的基本使用,及其与java数组的区别scala数组基本操作d
- XML对开发者来说十分的方便,不仅使用起来简单,而且能够及时调试,修改界面之后马上能看到效果。Java设置布局不具有这个优势。但是java却
- 1,MainActivity的xml布局<?xml version="1.0" encoding="ut
- 本文实例讲述了Android Appwidget用法。分享给大家供大家参考,具体如下:App Widgets 是一个小型应用程序的View&
- RMI 介绍RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中
- 分页使用可以说非常普遍了,有时候会需要非常灵活的方式去开启或关闭分页,尝试使用一 * 解的方式来进行分页。依赖安装需要使用的依赖:Mybati