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 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中使用print、printf、println的示例及区别

    Java中使用print、printf、println的示例及区别

    Java 的输出方式一般有这三种,print、println、printf,它们都是 java.long 包里的System类中的方法,本文重点给大家介绍Java中使用print、printf、println的示例,需要的朋友可以参考下
    2023-05-05
  • Java中的字符型文件流FileReader和FileWriter详细解读

    Java中的字符型文件流FileReader和FileWriter详细解读

    这篇文章主要介绍了Java中的字符型文件流FileReader和FileWriter详细解读,与字节型文件流不同,字节型文件流读取和写入的都是一个又一个的字节,而字符型文件流操作的单位是一个又一个的字符,字符型流认为一个字母是一个字符,而一个汉字也是一个字符,需要的朋友可以参考下
    2023-10-10
  • springBoot整合jwt实现token令牌认证的示例代码

    springBoot整合jwt实现token令牌认证的示例代码

    实施Token验证的方法挺多的,还有一些标准方法,比如JWT,本文主要介绍了springBoot整合jwt实现token令牌认证的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • JavaMail发送(带图片和附件)和接收邮件实现详解(四)

    JavaMail发送(带图片和附件)和接收邮件实现详解(四)

    这篇文章主要为大家详细介绍了JavaMail带图片和附件的发送和接收邮件实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • springboot创建的web项目整合Quartz框架的项目实践

    springboot创建的web项目整合Quartz框架的项目实践

    本文主要介绍了springboot创建的web项目整合Quartz框架的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • java数据结构关于栈的实例应用

    java数据结构关于栈的实例应用

    大家好,本篇文章主要讲的是java数据结构关于栈的实例应用,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • mybatis-plus报错Not Found TableInfoCache异常问题

    mybatis-plus报错Not Found TableInfoCache异常问题

    在集成百度uid-generator过程中,MyBatis-Plus报错NotFoundTableInfoCache异常,解决方法:检查实体类是否继承了官方model,确保实体类对应的mapper已正确注入,在使用@Component注解时,应保证相关依赖已注入
    2024-09-09
  • Spring Boot使用线程池创建多线程的完整示例

    Spring Boot使用线程池创建多线程的完整示例

    在 Spring Boot 2 中,可以使用 @Autowired 注入 线程池(ThreadPoolTaskExecutor 或 ExecutorService),从而管理线程的创建和执行,以下是使用 @Autowired 方式注入线程池的完整示例,感兴趣的朋友一起看看吧
    2025-03-03
  • Spring @InitBinder注解使用及原理详解

    Spring @InitBinder注解使用及原理详解

    这篇文章主要为大家介绍了Spring @InitBinder注解使用及原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • vscode 配置java环境并调试运行的详细过程

    vscode 配置java环境并调试运行的详细过程

    这篇文章主要介绍了vscode 配置java环境并调试运行的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05

最新评论