Java中List常用操作比for循环更优雅的写法示例

 更新时间:2021年11月03日 15:16:02   作者:Mr泰迪  
List是Java中比较常用的集合类,关于List接口有很多实现类,下面这篇文章主要给大家介绍了关于Java中List常用操作比for循环更优雅的写法,需要的朋友可以参考下

引言

使用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表达式代码更加简洁明了,当然各人有各人的编码习惯,不喜勿喷。

到此这篇关于Java中List常用操作比for循环更优雅的写法的文章就介绍到这了,更多相关Java中List常用操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java循环结构、数组的使用小结

    java循环结构、数组的使用小结

    这篇文章主要介绍了java循环结构、数组的使用小结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • springboot jsp支持以及转发配置方式

    springboot jsp支持以及转发配置方式

    文章介绍了如何在Spring Boot项目中配置和使用JSP,并提供了一步一步的指导,包括添加依赖、配置文件设置、控制器和视图的使用
    2024-12-12
  • @RequestBody注解Ajax post json List集合数据请求400/415的处理

    @RequestBody注解Ajax post json List集合数据请求400/41

    这篇文章主要介绍了@RequestBody注解Ajax post json List集合数据请求400/415的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Spring Boot打war包的实例教程

    Spring Boot打war包的实例教程

    本篇文章主要介绍了Spring Boot打war包的实例教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Feign Client超时时间设置不生效的解决方法

    Feign Client超时时间设置不生效的解决方法

    这篇文章主要为大家详细介绍了Feign Client 超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助
    2025-04-04
  • JVM处理未捕获异常的方法详解

    JVM处理未捕获异常的方法详解

    这篇文章主要给大家介绍了关于JVM处理未捕获异常的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 浅谈Java 中的引用类型

    浅谈Java 中的引用类型

    Java开发者肯定都很熟悉java中的4种引用类型,它们从强到弱分别是:强引用、软引用、弱引用和虚引用,下面我们详细看看这些引用类型
    2020-02-02
  • LeetCode程序员面试题之无重复字符的最长子串

    LeetCode程序员面试题之无重复字符的最长子串

    Java计算无重复字符的最长子串是一种常见的字符串处理算法,它的目的是找出一个字符串中无重复字符的最长子串。该算法可以很好地解决一些字符串处理问题,比如寻找字符串中重复字符的位置,以及计算字符串中无重复字符的最长子串的长度。
    2023-02-02
  • Spring Boot项目中集成微信支付v3

    Spring Boot项目中集成微信支付v3

    这篇文章主要介绍了Spring Boot项目中集成微信支付v3,帮助大家更好的理解和使用spring boot框架,感兴趣的朋友可以了解下
    2021-01-01
  • 解决mybatis中resultType取出数据顺序不一致的问题

    解决mybatis中resultType取出数据顺序不一致的问题

    这篇文章主要介绍了解决mybatis中resultType取出数据顺序不一致的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论