当前位置: 首页 > news >正文

List中的对象进行排序处理

以下是使用 Java Stream 对对象列表按 idage 排序的完整示例,包含升序和降序两种场景:

1. 定义测试对象类

@Getter
@Setter
public class Person {private int id;private int age;
}

2. 排序实现代码

import java.util.*;
import java.util.stream.Collectors;public class StreamSortExample {public static void main(String[] args) {List<Person> people = Arrays.asList(new Person(3, 25),new Person(1, 30),new Person(2, 20),);System.out.println("原始列表: " + people);// 升序排序(id优先,age次之)List<Person> ascending = people.stream().sorted(Comparator.comparing(Person::getId).thenComparing(Person::getAge)).collect(Collectors.toList());// 降序排序(id优先,age次之)List<Person> descending = people.stream().sorted(Comparator.comparing(Person::getId, Comparator.reverseOrder()).thenComparing(Person::getAge, Comparator.reverseOrder())).collect(Collectors.toList());System.out.println("升序结果: " + ascending);System.out.println("降序结果: " + descending);}
}

3. 输出结果

原始列表: [Person{id=3, age=25}, Person{id=1, age=30}, Person{id=2, age=20}, Person{id=3, age=20}]
升序结果: [Person{id=1, age=30}, Person{id=2, age=20}, Person{id=3, age=20}, Person{id=3, age=25}]
降序结果: [Person{id=3, age=25}, Person{id=3, age=20}, Person{id=2, age=20}, Person{id=1, age=30}]

注意点说明:

  1. 排序优先级

    • thenComparing() 表示当主排序字段(id)相同时,使用次要字段(age)继续排序
    • 示例中 id=3 的两个对象会按 age 进一步排序
  2. 升序实现

    Comparator.comparing(Person::getId).thenComparing(Person::getAge)
    
  3. 降序实现

    Comparator.comparing(Person::getId, Comparator.reverseOrder()).thenComparing(Person::getAge, Comparator.reverseOrder())
    
    • 每个字段的比较器都需要单独指定排序顺序
    • 使用 Comparator.reverseOrder() 明确指定降序
  4. 扩展性

    • 要添加更多排序字段,继续追加 .thenComparing()
    • 要改变排序优先级,调整方法调用顺序即可

动态排序,封装成方法块

如果需要运行时动态指定排序规则,可以使用函数式接口:

public static List<Person> sort(List<Person> list, Comparator<Person> comparator) {return list.stream().sorted(comparator).collect(Collectors.toList());
}// 调用示例
sort(people, Comparator.comparing(Person::getId).thenComparing(Person::getAge));

这种方法可以将排序逻辑与具体实现解耦,提高代码复用性。

http://www.dtcms.com/a/265506.html

相关文章:

  • SpringBoot + LiteFlow实现流程编排
  • 苹果手机扫描PDF:整理课堂笔记、保存重要文件
  • 解锁高难度PDF!MinerU部署保姆教程 + Dify联合解析《少年百科》
  • OpenCV CUDA模块设备层-----在 GPU 上执行类似于 std::copy 的操作函数warpCopy()
  • gateway断言配置详解
  • Web基础关键_007_JavaScript 的 DOM
  • 算法学习笔记:5.后缀数组——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 华为c编程规范
  • 【大模型】从0到1:DeepSeek + Coze API调用全攻略,企业,开发个人专属AI智能体使用详解,小白也能轻松上手
  • Qt编程-qml操作(js,c++,canvas)
  • spring boot如何只修改配置文件就解决swagger漏洞
  • Spring 6 源码深度掘金:66+核心原理与高频面试攻坚指南
  • 朝鲜APT组织使用Nim语言恶意软件对macOS发起隐秘Web3与加密货币攻击
  • 中国户外品牌全球竞争力榜单发布:科技突围与文化赋能重塑行业格局
  • 现代工程科技杂志投稿
  • 后端MVC(控制器与动作方法的关系)
  • 微服务外联Feign调用:第三方API调用的负载均衡与容灾实战
  • C++之路:类基础、构造析构、拷贝构造函数
  • Rust Web 全栈开发(一):构建 TCP Server
  • Go基础(Gin)
  • Webpack 5 核心机制详解与打包性能优化实践
  • 牛客:HJ16 购物单【01背包】【华为机考】
  • 前端单元测试覆盖率工具有哪些,分别有什么优缺点
  • 在 Sepolia 上使用 Zama fhEVM 构建隐私代币与流动性池:全流程实战指南
  • Android音视频探索之旅 | CMake基础语法 创建支持Ffmpeg的Android项目
  • 【免费.NET方案】CSV到PDF与DataTable的快速转换
  • 音频动态压缩算法曲线实现
  • C++【成员变量、成员函数、this指针】
  • OSPF高级特性之FRR
  • Vue 项目在哪里加载「字典数据」最好