文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Java中如何给List进行排序?这7种方法都可以轻松实现!

2023-09-16 08:57

关注

你好,这里是Java架构历程,每天一个Java知识,愿我们每个Java开发者早日成为Java架构师,加油!

在Java中我们经常需要对 ArrayList、LinkedList 或 CopyOnWriteArrayList 等列表进行排序,在Java8出现之前,排序虽然能够实现,但是代码写起来不是很优雅,而且性能上也没有什么优势。Java 8 及其以后之后,引入了 Lambda 表达式和方法引用,可以根据不同的条件以不同的顺序对对象列表进行排序,Comparator API 的增强功能也使 Java 中的对象比较和排序变得更加容易。

在本文,我将介绍如何使用 Lambda 表达式和方法引用对 ArrayList 等 List 进行排序,我将介绍7种方法,下面就直接进入代码实战。

在开始介绍前,我们先新建一个学生类Student类,作为List中的对象:

Student:

package com.test.javaroads.java8sort;import lombok.Data;@Data@AllArgsConstructorpublic class Student {        private String sid;        private String name;        private Integer age;        private String gender;        private String className;}

如上代码,新建了Stdent类,属性有:学生ID(sid)、学生姓名(name)、学生年龄(age)、性别(gender)、所属班级(className)。

方法一

在Java8之前,没有lambda表达式,一般都是java.util包中的Collections.sort()方法,代码如下:

package com.test.javaroads.java8sort;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.stream.Collectors;public class Sort {    public static void main(String[] args) {        List studentList = Arrays.asList(                new Student("s1", "小李", 18, "女", "一班"),                new Student("s2", "小王", 20, "男", "三班"),                new Student("s3", "小张", 19, "男", "四班"),                new Student("s4", "小汪", 19, "男", "二班"));        System.out.println("排序前");        studentList.forEach(System.out::println);        // 方法一:Java8之前,不用lambda表达式        Collections.sort(studentList, new Comparator() {            @Override            public int compare(Student student1, Student student2) {                return student1.getAge() - student2.getAge();            }        });        // 用forEach打印出排序后的list        System.out.println("排序后的list:");        studentList.forEach(System.out::println);    }}

打印结果:

如上代码所示,成功使用Collections.sort()方法将学生列表根据年龄排好序了。

方法二

在Java8中,可以利用lambda表达式进行排序:

// 方法二:Java8中使用lambda表达式Collections.sort(studentList, (student1, student2) -> student1.getClassName().compareTo(student2.getClassName()));

打印结果:

如上代码所示,成功使用Collections.sort(studentList, (student1, student2) -> student1.getClassName().compareTo(student2.getClassName()));lambda表达式将学生列表根据班级排好序了。

方法三

可以使用类型推断增强lambda表达式,代码如下:

// 方法三:通过类型推断增强lambda表达式Collections.sort(studentList, (student1, student2) -> student1.getAge() - student2.getAge());

打印结果:

如上代码所示,通过类型推断增强lambda表达式将学生列表根据学生年龄排好序了。

方法四

可以通过lambda表达式结合静态方法引用进行排序,所以需要在Student中增加静态方法:

public static int compareByAge(Student student1, Student student2) {    return student1.getAge().compareTo(student2.getAge());}
// 方法四:通过lambda表达式结合静态方法引用Collections.sort(studentList, Student::compareByAge);

打印结果:

如上代码,我们先是在Student类中增加了compareByAge的静态方法,然后结合lambda表达式成功进行了排序。

方法五

可以通过Comaprator的comparing()方法进行排序:

// 方法五:通过使用Comaprator的comparing()方法Collections.sort(studentList, Comparator.comparing(Student::getAge));

打印结果:

如上代码,我们通过Comaprator的comparing()方法成功进行了排序。

方法六

可以通过以下代码实现倒叙排序:

// 方法六:lambda倒叙Comparator compare = (student1, student2) -> student1.getAge() - student2.getAge();Collections.sort(studentList, compare.reversed());

打印结果:

可以看到,我们成功的通过reversed()方法实现了倒序排序。

方法七

当排序条件非常多的时候应该怎么做?要善于使用lambda表达式:

// 方法七:多条件排序Collections.sort(studentList, (student1, student2) -> {    if (student1.getGender().equals(student2.getGender())) {        return student1.getAge() - student2.getAge();    } else {        return student1.getClassName().compareTo(student2.getClassName());    }});

打印结果:

可以看出,不管条件多么多,只要使用lambda表达式,结合if表达式灵活实现了列表多条件的排序功能。

总结

以上我介绍了7种列表排序的方法,在 Java 8 之前,我们使用 for-each 循环遍历 List 并打印列表的每个内容,Java 8以后就可以使用forEach() 方法对于lambdas的应用非常实用。

从文中介绍的排序方法,可以看出在 Java 8 中使用 lambda 表达式对列表进行排序会使得代码简洁且富有表现力,希望大家在遇到排序场景的时候,多使用lambda 表达式。

最后感谢您的阅读,希望本文对您有所帮助,有任何问题都可以在下方评论区与我讨论!

来源地址:https://blog.csdn.net/weixin_43025343/article/details/132169310

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯