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

标签:java,list,for循环
0
投稿

猜你喜欢

  • Java String的intern用法解析

    2023-04-22 19:03:35
  • Java 线程池ThreadPoolExecutor源码解析

    2022-06-28 09:13:59
  • Java两个乒乓球队比赛名单问题(判断素数)

    2022-11-15 08:39:20
  • MyBatis利用MyCat实现多租户的简单思路分享

    2022-08-16 18:58:33
  • 基于XSLT调试的相关问题

    2022-11-01 14:22:53
  • Android自定义View实现波浪动画

    2022-05-27 23:04:46
  • Spring中校验器(Validator)的深入讲解

    2022-03-05 11:58:35
  • SpringMVC源码解读之HandlerMapping

    2023-07-23 22:18:05
  • Spring Boot集成MyBatis实现通用Mapper的配置及使用

    2023-07-03 18:17:10
  • Java实现用户管理系统

    2023-08-26 17:18:21
  • 浅谈C#中的委托、事件与异步

    2022-04-25 23:05:34
  • Java实现调用对方http接口得到返回数据

    2023-02-27 22:36:29
  • Fastjson 常用API介绍及下载地址(推荐)

    2023-03-18 23:48:47
  • Unity 点击UI与点击屏幕冲突的解决方案

    2022-02-22 15:50:49
  • Java中ArrayList与顺序表的概念与使用实例

    2023-01-09 03:50:30
  • maven的生命周期及常用命令介绍

    2022-03-10 17:21:16
  • c#实现无标题栏窗口的拖动

    2022-12-26 06:15:15
  • 使用springboot跳转到指定页面和(重定向,请求转发的实例)

    2021-10-21 11:09:24
  • Java自动生成趋势比对数据的方法分享

    2023-11-25 18:29:18
  • Java实现读取resources目录下的文件路径的九种方式

    2023-11-23 11:47:02
  • asp之家 软件编程 m.aspxhome.com