List常用操作比for循环更优雅的写法

简介: 引言使用JDK1.8之后,大部分list的操作都可以使用lamada表达式去写,可以让代码更简洁,开发更迅速。以下是我在工作中常用的lamada表达式对list的常用操作,喜欢建议收藏。以用户表为例,用户实体代码如下:

引言

使用JDK1.8之后,大部分list的操作都可以使用lamada表达式去写,可以让代码更简洁,开发更迅速。以下是我在工作中常用的lamada表达式对list的常用操作,喜欢建议收藏。

以用户表为例,用户实体代码如下:

public class User {
    private Integer id; //id
    private String name; //姓名
    private Integer age; //年龄
    private Integer departId; //所属部门id
}
List<User> list = new ArrayList<>();

简单遍历

使用lamada表达式之前,如果需要遍历list时,一般使用增强for循环,代码如下:

List<User> list = new ArrayList<>();
for (User u:list) {
    System.out.println(u.toString());
}

使用lamada表达式之后,可以缩短为一行代码:

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);
  }
}

使用lamada表达式写法为:

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());
}

lamada表达式写法为:

List<Integer> ids = list.stream()
                           .map(User::getId).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);
  }
}

lamada表达式写法为:

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);
  }
}

使用lamada表达式写法为:

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);
    }
  }
}

使用lamada表达式,代码如下:

Map<Integer,List<User>> departGroupMap = list.stream()
                                                               .filter(u->u.getAge() >= 15 && u.getAge() <= 17)
                                                               .collect(Collectors.groupingBy(User::getDepartId));

总结

上述部分是小编在工作中遇到的常用的单个List的操作,可能在项目中还会遇到更复杂的场景,可以根据需要进行多个方法的组合使用,我的感觉是使用lamada表达式代码更加简洁明了,当然各人有各人的编码习惯,不喜勿喷。

相关文章
|
6月前
|
索引 容器
06-python数据容器-list列表定义/list的10个常用操作/列表的遍历/使用列表取出偶数
06-python数据容器-list列表定义/list的10个常用操作/列表的遍历/使用列表取出偶数
|
6月前
|
Oracle Java 关系型数据库
Java【代码分享 06】Lamda表达式将List对象中的Map对象的key全部转化为大写或者小写(去除外层循环:可用于Map对象中的key全部转化为大写或者小写)
Java【代码分享 06】Lamda表达式将List对象中的Map对象的key全部转化为大写或者小写(去除外层循环:可用于Map对象中的key全部转化为大写或者小写)
295 0
|
Python
巧用list与for循环求和
巧用list与for循环求和
130 0
|
安全 小程序 Java
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(2)
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(2)
|
安全 小程序 Java
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(1)
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(1)
|
存储 缓存 NoSQL
redis 五种数据结构常用操作命令详解(String,list,set,zset,hash)
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:
393 0
redis 五种数据结构常用操作命令详解(String,list,set,zset,hash)
|
Java
Java面试题:循环删除 List 中的元素
Java面试题:循环删除 List 中的元素
138 0
|
Shell
shell:脚本数组list定义、长度获取、循环打印、数组切片、字符串转换
shell:脚本数组list定义、长度获取、循环打印、数组切片、字符串转换
2063 0
|
Python
python for 循环 遍历 两个 List
python for 循环 遍历 两个 List
148 0
|
JavaScript 前端开发 云计算
PIE-engine 教程 ——云计算当中的list列表案例分析(for循环list)
PIE-engine 教程 ——云计算当中的list列表案例分析(for循环list)
151 0
PIE-engine 教程 ——云计算当中的list列表案例分析(for循环list)