Java中Stream实现List排序的六个核心技巧总结

 更新时间:2025年04月22日 09:33:15   作者:藥師YS  
这篇文章主要介绍了Java中Stream实现List排序的六个核心技巧,分别是自然序排序、反向排序、空值安全处理、多字段组合排序、并行流加速、原地排序等,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、基础排序实现

1.1 自然序排序(正序)

List<Entity> sortedList = originalList.stream()
        .sorted(Comparator.comparing(Entity::getId))
        .collect(Collectors.toList());

1.2 反向排序(倒序)

List<Entity> sortedList = originalList.stream()
        .sorted(Comparator.comparing(Entity::getId).reversed())
        .collect(Collectors.toList());

二、进阶排序技巧

2.1 空值安全处理

// 处理可能为null的字段
Comparator<Entity> nullSafeComparator = Comparator.comparing(
    Entity::getId, 
    Comparator.nullsFirst(Comparator.naturalOrder())
);

List<Entity> sortedList = originalList.stream()
        .sorted(nullSafeComparator)
        .collect(Collectors.toList());

2.2 多字段组合排序

List<Entity> sortedList = originalList.stream()
        .sorted(Comparator.comparing(Entity::getDepartment)
                .thenComparing(Entity::getId))
        .collect(Collectors.toList());

三、性能优化建议

3.1 并行流加速(适用于大数据量)

List<Entity> sortedList = originalList.parallelStream()
        .sorted(Comparator.comparing(Entity::getId))
        .collect(Collectors.toList());

3.2 原地排序(修改原集合)

originalList.sort(Comparator.comparing(Entity::getId));

四、最佳实践

  • 类型明确化:推荐指定具体集合类型
ArrayList<Entity> sortedList = originalList.stream()
        .sorted(Comparator.comparing(Entity::getId))
        .collect(Collectors.toCollection(ArrayList::new));
  • 防御性拷贝:保持原集合不可变
List<Entity> sortedList = new ArrayList<>(originalList);
sortedList.sort(Comparator.comparing(Entity::getId));
  • Lambda优化:复杂场景使用Lambda表达式
List<Entity> sortedList = originalList.stream()
        .sorted((e1, e2) -> {
            // 自定义比较逻辑
            return e1.getId().compareTo(e2.getId());
        })
        .collect(Collectors.toList());

五、注意事项

  • 不可变性Collectors.toList()返回的List实现可能不支持修改
  • 空指针防护:推荐始终使用Comparator.nullsFirst/nullsLast
  • 性能权衡:超过10万条数据时优先考虑传统排序方式
  • 对象状态:Stream操作不会修改原始集合元素

六、完整示例

public class SortingDemo {
    public static void main(String[] args) {
        List<Entity> entities = Arrays.asList(
            new Entity(2, "B"),
            new Entity(1, "A"),
            new Entity(3, "C")
        );

        // 多条件排序:先按名称倒序,再按ID正序
        List<Entity> sorted = entities.stream()
                .sorted(Comparator.comparing(Entity::getName)
                        .reversed()
                        .thenComparing(Entity::getId))
                .collect(Collectors.toList());

        sorted.forEach(System.out::println);
    }
}

class Entity {
    private int id;
    private String name;
    
    // 构造方法和getter省略
}

七、总结对比

排序方式时间复杂度空间复杂度适用场景
Stream顺序流O(n log n)O(n)通用场景
Stream并行流O(n log n)O(n)大数据量(10w+)
Collections.sortO(n log n)O(1)原地修改需求
数据库排序O(n log n)O(1)数据源在数据库时

通过合理选择排序策略,可以在保证代码简洁性的同时兼顾系统性能。建议根据实际业务场景选择最合适的排序方式。

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

相关文章

  • 深入SQLite多线程的使用总结详解

    深入SQLite多线程的使用总结详解

    本篇文章是对SQLite多线程的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • spring-boot使用Admin监控应用的方法

    spring-boot使用Admin监控应用的方法

    本篇文章主要介绍了spring-boot使用Admin监控应用的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • java实现后台图片跨域上传功能

    java实现后台图片跨域上传功能

    这篇文章主要给大家介绍了关于java实现后台图片跨域上传功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Redis中4种延时队列实现方式小结

    Redis中4种延时队列实现方式小结

    Redis作为高性能的内存数据库,具备原子操作、数据结构丰富和简单易用的特性,本文将介绍基于Redis实现分布式延时队列的四种方式,大家可以根据需要进行选择
    2025-04-04
  • Springboot内嵌tomcat应用原理深入分析

    Springboot内嵌tomcat应用原理深入分析

    懂得SpringBoot的童鞋应该很清楚,不管应用程序是属于何种类型,都是一个Main方法走遍天下,对于web应用,只需要引入spring-boot-starter-web中这个依赖,应用程序就好像直接给我们来了个tomcat一样,对于嵌入式Tomcat,其实也非常简单,就是调用Tomcat提供的外部类
    2022-09-09
  • Spring及Mybatis整合占位符解析失败问题解决

    Spring及Mybatis整合占位符解析失败问题解决

    这篇文章主要介绍了Spring及Mybatis整合占位符解析失败问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java聊天室之解决连接超时问题

    Java聊天室之解决连接超时问题

    这篇文章主要为大家详细介绍了Java简易聊天室之解决连接超时问题的方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-10-10
  • java int转byte和long转byte的方法

    java int转byte和long转byte的方法

    下面小编就为大家带来一篇java int转byte和long转byte的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • java中SPI服务提供者的接口使用总结

    java中SPI服务提供者的接口使用总结

    SPI英文全称为Service Provider Interface,顾名思义,服务提供者接口,它是jdk提供给“服务提供厂商”或者“插件开发者”使用的接口
    2022-02-02
  • Java之IO流面试题案例讲解

    Java之IO流面试题案例讲解

    这篇文章主要介绍了Java之IO流案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论