关于list集合排序的常见方法

news2025/7/21 18:28:11

目录

1、list.sort()

2、Collections.sort()

3、Stream.sorted()

4、进阶排序技巧

4.1 空值安全处理

4.2 多字段组合排序

4.3. 逆序

5、性能优化建议

5.1 并行流加速

5.2 原地排序

6、最佳实践

7、注意事项


前言

        Java中对于集合的排序操作,分别为list.sort()方法Collections.sort()方法,和Stream流实现List排序的核心技巧。

更多集合和数组的可参考:深入探讨集合与数组转换方法-CSDN博客


1、list.sort()

(Comparator) 方法(推荐)这是 Java 8 引入的最推荐的排序方式,语法简洁、可读性强。

List<Entity> list = new ArrayList<>();
list.add(new Entity(3));
list.add(new Entity(1));
list.add(new Entity(2));

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

2、Collections.sort()

(list,Comparator)适用于 Java 8 之前的版本,或者习惯使用传统的排序方式。

Collections.sort(list, Comparator.comparing(Entity::getId));

3、Stream.sorted()

(惰性排序):适用于需要链式处理或中间处理的场景,但不会修改原始列表。

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

1.自然序排序(正序)

    @Test
    public void test1() {
        List<Person> originalList = new ArrayList<>();
        originalList.add(new Person(3,"张三"));
        originalList.add(new Person(1,"李四"));
        originalList.add(new Person(2,"王武"));
        List<Person> sortedList = originalList.stream()
                .sorted(Comparator.comparing(Person::getId))
                .collect(Collectors.toList());
        sortedList.forEach(person -> System.out.println(person.getId()));
    }
输出示例:
李四::1
王武::2
张三::3

2.反向排序(倒序)

    @Test
    public void test1() {
        List<Person> originalList = new ArrayList<>();
        originalList.add(new Person(3,"张三"));
        originalList.add(new Person(1,"李四"));
        originalList.add(new Person(2,"王武"));
        List<Person> sortedList = originalList.stream()
                .sorted(Comparator.comparing(Person::getId).reversed())
                .collect(Collectors.toList());
        sortedList.forEach(person -> System.out.println(person.getName()+"::"+person.getId()));
    }
输出示例:
张三::3
王武::2
李四::1

4、进阶排序技巧

4.1 空值安全处理

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

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

4.2 多字段组合排序

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

4.3. 逆序

list.sort(Comparator.comparingInt(Entity::getId).reversed());


5、性能优化建议

5.1 并行流加速

使用范围:适用于大数据量

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

5.2 原地排序

使用范围:修改原集合

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

6、最佳实践

1.类型明确化

推荐指定具体集合类型

ArrayList<Entity> sortedList = originalList.stream()
        .sorted(Comparator.comparing(Person::getId))
        .collect(Collectors.toCollection(ArrayList::new));

2.防御性拷贝

保持原集合不可变

List<Entity> sortedList = new ArrayList<>(originalList);
sortedList.sort(Comparator.comparing(Entity::getId));

3.Lambda优化

复杂场景使用Lambda表达式

List<Entity> sortedList = originalList.stream()
        .sorted((e1, e2) -> {
            // 自定义比较逻辑
            return e1.getId().compareTo(e2.getId());
        })
        .collect(Collectors.toList());

7、注意事项

  1. 不可变性Collectors.toList()返回的List实现可能不支持修改
  2. 空指针防护:推荐始终使用Comparator.nullsFirst/nullsLast
  3. 性能权衡:超过10万条数据时优先考虑传统排序方式
  4. 对象状态: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省略
}


总结对比

        在 Java 中,对 List 集合进行排序是开发中非常常见的操作。

        Java 提供了多种方式来实现排序功能,每种方法都有其适用场景和特点。可以灵活地对 Java 中的 List 进行排序操作,根据具体需求选择最适合的方式。


参考文章:

1、Java Stream实现List排序的6个核心技巧_java list stream 排序-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2398187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不动产登记区块链系统(Vue3 + Go + Gin + Hyperledger Fabric)

好久没有介绍过新项目的制作了&#xff0c;之前做的一直都是Fisco Bcos的项目&#xff0c;没有介绍过Hyperledger Fabric的项目&#xff0c;这次来给大家分享下。 系统概述 不动产登记与交易平台是一个基于Hyperledger Fabric的综合性管理系统&#xff0c;旨在实现不动产登记…

从 GPT 的发展看大模型的演进

这是一个技术爆炸的时代。一起来看看 GPT 诞生后&#xff0c;与BERT 的角逐。 BERT 和 GPT 是基于 Transformer 模型架构的两种不同类型的预训练语言模型。它们之间的角逐可以从 Transformer 的编码解码结构角度来分析。 BERT&#xff08;Bidirectional Encoder Representatio…

【Qt】构建目录设置

问题 ProjectRoot/├── src/ # 源代码│ ├── project1│ └── project2├── build/ # 构建目录│ ├── build-PCIeDemoApp-Desktop_Qt_5_9_7_MSVC2015_64bit-Debug/│ └── build-PCIeDemoApp-Desktop_Qt_5_9_7_MSVC2015_64bit-Rele…

Web后端快速入门(Maven)

Maven是apche旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 开源项目&#xff1a;Welcome to The Apache Software Foundation. Maven的作用&#xff1a; 依赖管理&#xff08;方便快捷的管理项目依赖的资源&#xff0c;避免版本冲突问题&#xff09…

机器学习算法:逻辑回归

1. 基础概念 定义&#xff1a; 逻辑回归&#xff08;Logistic Regression&#xff09;是一种用于解决二分类问题的监督学习算法&#xff0c;通过概率预测样本属于某一类别的可能性。 核心特点&#xff1a;输出是概率值&#xff08;0~1&#xff09;&#xff0c;通过阈值&#…

AI健康小屋+微高压氧舱:科技如何重构我们的健康防线?

目前&#xff0c;随着科技和社会的不断发展&#xff0c;人们的生活水平和方式有了翻天覆地的变化。 从吃饱穿暖到吃好喝好再到健康生活&#xff0c;观念也在逐渐发生改变。 尤其是在21世纪&#xff0c;大家对健康越来越重视&#xff0c;这就不得不提AI健康小屋和氧舱。 一、A…

如何做接口测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 01、通用的项目架构 02、什么是接口 接口&#xff1a;服务端程序对外提供的一种统一的访问方式&#xff0c;通常采用HTTP协议&#xff0c;通过不同的url&#xff…

【JMeter】性能测试知识和工具

目录 何为系统性能 何为性能测试 性能测试分类 性能测试指标 性能测试流程 性能测试工具&#xff1a;JMeter&#xff08;主测web应用&#xff09; jmeter文件目录 启动方式 基本元件&#xff1a;元件内有很多组件 jmeter参数化 jmeter关联 自动录制脚本 直连数据库…

SOC-ESP32S3部分:25-HTTP请求

飞书文档https://x509p6c8to.feishu.cn/wiki/KL4RwxUQdipzCSkpB2lcBd03nvK HTTP&#xff08;Hyper Text Transfer Protocol&#xff09; 超文本传输协议&#xff0c;是一种建立在 TCP 上的无状态连接&#xff0c;整个基本的工作流程是客户端发送一个 HTTP 请求&#xff0c;说明…

字符编码全解析:ASCII、GBK、Unicode、UTF-8与ANSI

UTF - 8(全球字符能被唯一标识)、GBK、Unicode、ANSI 区别与关联 qwen模型分词器文件 1. ASCII(基础铺垫,理解编码起源) 作用:最早期为处理英文文本设计,是字符编码的基础,后演变成其他编码兼容的一部分 。范围:共 128 个字符(0 - 127),包含英文大小写字母、数字…

MaxCompute开发UDF和UDTF案例

文章目录 一、Java开发UDF1、创建Maven项目2、创建UDF类3、打包上传资源4、创建函数MyUDF5、SQL验证 二、Java开发UDTF1、创建Maven项目2、创建UDTF类3、打包上传更新资源4、创建函数MyUDTF5、SQL验证 三、常见问题1、发布函数报错 一、Java开发UDF 1、创建Maven项目 创建Mav…

49套夏日小清新计划总结日系卡通ppt模板

绿色小清新PPT模版&#xff0c;日系小清新PPT模版&#xff0c;粉红色PPT模版&#xff0c;蓝色PPT模版&#xff0c;草青色PPT模版&#xff0c;日系卡通PPT模版 49套夏日小清新计划总结日系卡通ppt模板&#xff1a;夏日小清新日系卡通PPT模版https://pan.quark.cn/s/9e4270d390fa…

告别硬编码!用工厂模式优雅构建可扩展的 Spring Boot 应用 [特殊字符]

嗨&#xff0c;各位技术伙伴们&#xff01;&#x1f44b; 在日常的软件开发中&#xff0c;我们经常面临需求变更的挑战。如何构建一个既能满足当前需求&#xff0c;又能轻松应对未来变化的系统呢&#xff1f;答案往往藏在那些经典的设计模式中。 今天&#xff0c;我们就来聊聊…

Express教程【006】:使用Express写接口

文章目录 8、使用Express写接口8.1 创建API路由模块8.2 编写GET接口8.3 编写POST接口 8、使用Express写接口 8.1 创建API路由模块 1️⃣新建routes/apiRouter.js路由模块&#xff1a; /*** 路由模块*/ // 1-导入express const express require(express); // 2-创建路由对象…

mongodb集群之分片集群

目录 1. 适用场景2. 集群搭建如何搭建搭建实例Linux搭建实例(待定)Windows搭建实例1.资源规划2. 配置conf文件3. 按顺序启动不同角色的mongodb实例4. 初始化config、shard集群信息5. 通过router进行分片配置 1. 适用场景 数据量大影响性能 数据量大概达到千万级或亿级的时候&…

Starrocks Full GC日志分析

GC日志样例&#xff1a; [2025-06-03T07:36:06.1770800] GC(227) Pause Full (G1 Evacuation Pause) [2025-06-03T07:36:06.1960800] GC(227) Phase 1: Mark live objects [2025-06-03T07:36:06.9480800] GC(227) Cleaned string and symbol table, strings: 47009 processed,…

飞算 JavaAI 赋能老项目重构:破旧立新的高效利器

许多企业的 Java 老项目面临着代码陈旧、架构落后、维护困难等问题。老项目重构势在必行&#xff0c;却又因庞大的代码量、复杂的业务逻辑让开发团队望而却步。 老项目重构困境重重 传统的 Java 老项目往往在长期的迭代和维护中积累了诸多问题。一方面&#xff0c;代码质量堪…

typescript的Interface和Type

类型别名和接口非常相似&#xff0c;在大多数情况下你可以在它们之间自由选择。 几乎所有的 interface 功能都可以在 type 中使用&#xff0c;关键区别在于不能重新开放类型以添加新的属性&#xff0c;而接口始终是可扩展的。 // window.ts.transpileModule(src, {}); 这是调…

java后端生成心电图-jfreechart

用jfreechart生成心电图 先上成功的图片 上代码 1.导入包 implementation org.jfree:jfreechart:1.5.4implementation org.jfree:jcommon:1.0.242.实现代码 对数据进行滤波 转换单位 package com.shinrun.infrastructure.util;import java.util.ArrayList; import java.ut…

算法/机理模型演示平台搭建(二)——算法接口部署(FastApi)

算法/机理模型演示平台搭建(二)—— 算法接口部署(FastApi) 1. 项目结构2. 构建 Docker 镜像3. 运行 Docker 容器4. 访问 API 文档5. 调用 API1. 项目结构 app app/algorithms app/models Dockerfile FROM python:3.9-slimWORKDIR /codeCOPY ./requirements.txt /code…