Java中的lambda和stream实现排序

 更新时间:2022年09月21日 11:21:10   作者:ldcaws  
这篇文章主要介绍了Java中的lambda和stream实现排序,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言

在日常开发中,对数据排序是非常常见的一种需求,一般通过如下两种方式:

  • 存储系统:通过SQL、NoSQL的排序功能,查询的结果是完成排序的结果;
  • 内存:通过在内存中进行排序,查询的结果是无序的结果;

下面聊聊通过Java中的lambda和stream实现在内存中对数据进行排序。

1、定义一个基础类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

2、使用Comparator排序

	@Test
    void test() {
        List<Student> students = Lists.newArrayList(
                new Student("caocao", 21),
                new Student("sunquan", 20)
        );

        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        Assertions.assertEquals(students.get(0), new Student("caocao", 21));
    }

在定义的Comparator中使用name字段排序,string类型的排序是通过ASCII码顺序进行判断。

3、使用lambda排序

	@Test
    void test() {
        List<Student> students = Lists.newArrayList(
                new Student("caocao", 21),
                new Student("sunquan", 20)
        );

        students.sort((o1, o2) -> o1.getName().compareTo(o2.getName()));
        Assertions.assertEquals(students.get(0), new Student("caocao", 21));
    }

将内部类Comparator替换为lambda表达式,使代码更简洁。

4、使用Comparator的comparing方法排序

	@Test
    void test() {
        List<Student> students = Lists.newArrayList(
                new Student("caocao", 21),
                new Student("sunquan", 20)
        );

        students.sort(Comparator.comparing(Student::getName));
        Assertions.assertEquals(students.get(0), new Student("caocao", 21));
    }

5、自定义比对方法

在Student类中自定义比对方法

	public static int compareByNameThenAge(Student s1, Student s2) {
        if (s1.name.equals(s2.name)) {
            return Integer.compare(s1.age, s2.age);
        } else {
            return s1.name.compareTo(s2.name);
        }
    }

先比对name,再比对age

	@Test
    void test() {
        List<Student> students = Lists.newArrayList(
                new Student("caocao", 21),
                new Student("sunquan", 20)
        );

        students.sort((o1,o2) -> Student.compareByNameThenAge(o1,o2));
        Assertions.assertEquals(students.get(0), new Student("caocao", 21));
    }

6、使用stream排序

在流式计算时进行排序

	@Test
    void test() {
        List<Student> students = Lists.newArrayList(
                new Student("caocao", 21),
                new Student("sunquan", 20)
        );

        List<Student> result = students.stream().sorted(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getName().compareTo(o2.getName());
            }
        }).collect(Collectors.toList());
        
        Assertions.assertEquals(result.get(0), new Student("caocao", 21));
    }

7、null值判断

若列表中元素是null或列表中元素参与排序的字段是null,会出现NullPointException异常,即 NPE,简单演示一下:

	@Test
    void sortedNullGotNPE() {
        List<Student> students = Lists.newArrayList(
                null,
                new Student("liubei", 12)
        );
        students.sort(Comparator.comparing(Student::getName));
    }

修改为:

	@Test
    void sortedNullGotNPE() {
        List<Student> students = Lists.newArrayList(
                null,
                new Student("liubei", 12)
        );
        //students.sort(Comparator.comparing(Student::getName));

        Assertions.assertThrows(NullPointerException.class,
                () -> students.sort(Comparator.comparing(Student::getName)));
    }

到此这篇关于Java中的lambda和stream实现排序的文章就介绍到这了,更多相关Java lambda和stream 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SMBMS超市订单管理系统的网站源码

    SMBMS超市订单管理系统的网站源码

    这篇文章主要介绍了SMBMS超市订单管理系统,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能

    SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能

    这篇文章主要介绍了SpringBoot 整合 Elasticsearch 实现海量级数据搜索,本文主要围绕 SpringBoot 整合 ElasticSearch 接受数据的插入和搜索使用技巧,在实际的使用过程中,版本号尤其的重要,不同版本的 es,对应的 api 是不一样,需要的朋友可以参考下
    2022-07-07
  • 详解Java面向对象编程中方法的使用

    详解Java面向对象编程中方法的使用

    这篇文章主要介绍了详解Java面向对象编程中方法的使用,包括方法的重载和参数以及泛型方法等知识点,需要的朋友可以参考下
    2016-02-02
  • Spring AOP面向切面编程实现及配置详解

    Spring AOP面向切面编程实现及配置详解

    这篇文章主要介绍了Spring AOP面向切面编程实现及配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java判断字符串是否含有乱码实例代码

    Java判断字符串是否含有乱码实例代码

    本文通过实例代码给大家介绍了Java判断字符串是否含有乱码的方法,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-11-11
  • Java加密 消息摘要算法SHA实现详解

    Java加密 消息摘要算法SHA实现详解

    这篇文章主要介绍了Java加密 消息摘要算法SHA实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java按值传递和按址传递(面试常见)

    Java按值传递和按址传递(面试常见)

    这篇文章主要介绍了Java按值传递和按址传递(面试常见)知识,在面试笔试题中经常会遇到,今天小编给大家详细介绍下,需要的朋友可以参考下
    2017-02-02
  • java去除字符串中的空格、回车、换行符、制表符的小例子

    java去除字符串中的空格、回车、换行符、制表符的小例子

    java去除字符串中的空格、回车、换行符、制表符的小例子,需要的朋友可以参考一下
    2013-06-06
  • MyBatisPlus查询投影与查询条件详细讲解

    MyBatisPlus查询投影与查询条件详细讲解

    这篇文章主要介绍了MyBatisPlus DQL编程控制中的查询投影、查询条件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • java基于GUI实现简单画笔小画板

    java基于GUI实现简单画笔小画板

    这篇文章主要为大家详细介绍了java基于GUI实现简单画笔小画板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论