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.pswp.cn/web/87604.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87604.shtml

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

相关文章

秋招Day14 - Redis - 底层结构

Redis都有哪些底层数据结构&#xff1f; 有八种核心的底层数据结构。 SDS Redis自己实现的动态字符串&#xff0c;SDS结构中直接存储了已使用的字符数组长度len和未使用的字符数组长度free&#xff0c;所以获取长度的时间复杂度是O(1)&#xff0c;还支持动态扩容&#xff0c…

使用Mac自带的图像捕捉导出 iPhone 相册

用 数据线 将 iPhone 连接到 Mac必须是数据线,有些充电线插上去后无法识别到iphone在 iPhone 上点击“信任此电脑”在 Mac 上打开应用&#xff1a;快速方式&#xff1a;按 Command Space 打开 Spotlight&#xff0c;输入 图像捕捉 或 Image Capture&#xff0c;回车或者从 /系…

【UniApp picker-view 多列对齐问题深度剖析与完美解决】

UniApp picker-view 多列对齐问题深度剖析与完美解决一次看似简单的样式调整&#xff0c;却引发了对构建工具、CSS 预处理和组件渲染机制的深度思考创作时间: 2025/7/1 技术栈: UniApp Vue3 TypeScript PostCSS 问题级别: &#x1f534; 高级&#x1f3af; 问题背景 在开发 …

R Studio开发中记录

1.如何将tar.gz格式的源码R包编译为zip格式的二进制R包。 R CMD INSTALL --build knhanes.tar.gz R CMD INSTALL --build nhanes.tar.gz 2.下载RTools RTools: Toolchains for building R and R packages from source on Windows 3.修改环境变量 PATH$PATH:/d/rtools45/usr…

量化交易中的隐藏模式识别:基于潜在高斯混合模型的机会挖掘

*——从市场噪声中提取黄金信号的数学艺术** > 2025年3月,某对冲基金使用潜在高斯混合模型捕捉到铜期货的异常波动模式,提前布局实现单月收益47%。核心代码仅20行,却颠覆了传统技术分析范式。 --- ### 01 市场迷思:为何90%的交易者失败? 金融市场本质是**非…

Qt窗口被外部(非Qt内部机制)强制销毁,第二次再重复使用不显示

在Qt开发中&#xff0c;窗口被外部&#xff08;非Qt内部机制&#xff09;强制销毁 警告信息 External WM_DESTROY received for QWidgetWindow(0x108b8cbdb10, name"xxxxx") , parent: QWindow(0x0) , transient parent: QWindow(0x0) 使用场景 代码结构如下&#x…

一文详解Character AI:实用指南+ ChatGPT、Gemini对比分析

本指南将深入剖析Character AI的运行机制、功能特性及其存在的局限性。 近年来&#xff0c;生成式人工智能领域发展态势迅猛&#xff0c;其应用范畴已远超单纯的文本生成领域。在众多备受瞩目的新兴平台中&#xff0c;Character AI是一款支持用户以对话形式与人工智能生成角色…

遗传算法的原理与实现示例

遗传算法是一种受生物进化理论启发的随机优化算法&#xff0c;其核心思想是模拟自然界中 “物竞天择、适者生存” 的进化过程&#xff0c;通过对候选解的迭代优化&#xff0c;找到问题的最优解。 一、核心思想 遗传算法将优化问题的候选解视为生物群体中的“个体”&#xff0c…

centos7 ping127.0.0.1不通

ping 127.0.0.1&#xff0c;localhost和本地ip都不通&#xff0c;所有的配置也是正确的 检查下是否禁止了ping vim /proc/sys/net/ipv4/icmp_echo_ignore_all 内容为 1 禁止ping 内容为0 开启ping sysctl -w net.ipv4.icmp_echo_ignore_all0 变更以上设置即可

【无标题】JavaScript入门

JS 1.JS引入方式 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-引入方式</title><!-- …

(JAVA)自建应用调用企业微信API接口,实现消息推送

建议先简单了解企业微信开发者中心文档&#xff1a;开发前必读 - 文档 - 企业微信开发者中心 了解一下企业微信调用接口的基础参数&#xff1a;基本概念介绍 - 文档 - 企业微信开发者中心 本篇每个步骤都会跟着官网文档走&#xff0c;都会贴上相关链接&#xff0c;看完本篇文…

P/Invoke 在默认封送(marshalling)规则下,常见托管 ⇄ 非托管类型的对应关系

下表整理了 P/Invoke 在默认封送&#xff08;marshalling&#xff09;规则下&#xff0c;常见托管 ⇄ 非托管类型的对应关系。 内容主要依据微软官方 Marshalling Data with Platform Invoke 文档&#xff0c;并补充了常见指针&#xff0f;句柄用法与字符串缓冲区&#xff…

2.isaacsim4.2 教程-初识OmniGraph

1. OmniGraph&#xff08;视觉编程&#xff09; OmniGraph 是 Omniverse 的可视化编程框架。它提供了一个图状结构&#xff0c;将 Omniverse 内多个系统的功能节点串联起来&#xff1b;同时也是一个计算框架&#xff0c;允许你编写高度自定义的节点&#xff0c;将自己的功能无…

MonoGame 游戏开发框架日记 -03

第三章&#xff1a;创建类库 内容介绍 主要内容&#xff1a;创建Core类并编写 创建这个类主要是为了后续开发方便&#xff0c;并介绍游戏开发中的一种非常重要编程模式 单例模式&#xff0c;以及了解MonoGame基本图形渲染知识单例模式&#xff1a; 第一步我们得先了解什么是单例…

AES 256 CBC加密和解密

AES-256-CBC 是一种对称加密算法&#xff0c;使用 256位密钥 和 CBC&#xff08;Cipher Block Chaining&#xff09;模式。它的典型使用场景包括对敏感信息进行加密存储或传输。下面是 AES-256-CBC 的加密与解密的 Python 示例&#xff0c;使用 pycryptodome 库&#xff1a; &a…

Git 版本控制完全指南:从入门到精通

Git 版本控制完全指南&#xff1a;从入门到精通 作为当今最流行的分布式版本控制系统&#xff0c;Git 已经成为开发者必备的技能之一。无论你是独立开发者还是团队协作&#xff0c;Git 都能帮助你高效管理代码版本。本文将带你从零开始&#xff0c;逐步掌握 Git 的核心概念和常…

408第三季part2 - 计算机网络 - 计算机网络分层结构

理解 PCI会放一些控制信息&#xff0c;源地址目的地址都在里面 SDU是放的数据 整个加起来是PDU 每一层的SDU都是上一层的PDU 看一看 也是简单看一看就行 网络层有时候也叫IP数据报 这里断点下载的意思就是&#xff0c;你下载东西的时候网络断了&#xff0c;再连回来的时候会接…

打开摄像头,服务器和客户端传输摄像头图像数据

1&#xff1a;Camera Server 主要功能&#xff0c;打开摄像头&#xff0c;接收客户端请求 接收到客户端请求“R”字符后开始传输摄像头图像。 #include "mainwindow.h" #include "ui_mainwindow.h"#include<QDebug>MainWindow::MainWindow(QWidget…

Android实现获取前台应用信息

Android实现获取前台应用信息 1.前言&#xff1a; 之前需要获取在后台运行的App信息&#xff0c;比如包名、版本这些常规的&#xff0c;今天是讲解获取在前台的App信息&#xff0c;虽然App在前台&#xff0c;但是具体的信息可能不知道&#xff0c;今天就尝试获取一下&#xf…

快讯|美团即时零售日订单已突破1.2亿,餐饮订单占比过亿

据美团内网公布信息显示&#xff0c;截至22时54分&#xff0c;美团即时零售当日订单已经突破了1.2亿单&#xff0c;其中&#xff0c;餐饮订单已超过1亿单。 值得注意的是&#xff0c;就在当晚20时45分&#xff0c;美团内网曾显示即时零售日订单突破了1亿。这也意味着&#xff…