0

0

在Java中如何按条件排序集合_Java集合条件排序说明

P粉602998670

P粉602998670

发布时间:2026-02-07 10:14:02

|

465人浏览过

|

来源于php中文网

原创

Comparator用于定义Java自定义排序逻辑,返回负数/0/正数表示大小关系,需处理空值、多条件组合及中文拼音排序等场景。

在java中如何按条件排序集合_java集合条件排序说明

Comparator 实现自定义排序逻辑

Java 集合本身不带条件排序能力,得靠 Comparator 接口描述“怎么比”。它只关心两个元素谁在前、谁在后,返回负数、0 或正数即可。别写成布尔返回值——那是 Predicate 的事。

常见错误是直接在 sort() 里传一个 lambda 却忽略泛型,比如对 List 写成 (a, b) -> a.length() - b.length() 没问题,但若类型擦除后比较对象字段,编译器可能报错或运行时 ClassCastException

  • 优先用方法引用:比如按字符串长度排,写 Comparator.comparing(String::length) 比手写 lambda 更安全
  • 多个条件叠加用 thenComparing():如先按年龄升序,年龄相同时按姓名降序,写成 comparing(Person::getAge).thenComparing(Person::getName, Comparator.reverseOrder())
  • 空值要显式处理:默认 null 会抛 NullPointerException,用 Comparator.nullsFirst()nullsLast() 包一层

Collection.sort()Stream.sorted() 怎么选

核心区别就一条:前者直接改原集合(要求集合可修改),后者返回新流、不碰原数据。如果你排序后还要继续用原列表做其他操作,别用 sort() 把它改乱了。

性能上没本质差异,但 Stream.sorted() 在并行流里能自动分段归并,适合大数据量且已有 parallelStream() 上下文的场景;而 Collection.sort() 底层调的是 Timsort,对小数据更轻量。

立即学习Java免费学习笔记(深入)”;

  • 原地排序且确定集合可变 → 用 Collections.sort(list, comparator)
  • 不想动原数据,或后续还要 filter/map → 用 list.stream().sorted(comparator).collect(Collectors.toList())
  • 排序后只取前 N 条?别先 collect 再 subList,直接 stream().sorted().limit(N).collect() 更省内存

实体类字段为空时排序崩溃怎么办

最常见的运行时异常是 java.lang.NullPointerException,发生在比较字段为 null 时调用了 .compareTo().length() 这类方法。这不是排序逻辑写错了,而是没预设空值策略。

Postme
Postme

Postme是一款强大的AI写作工具,可以帮助您快速生成高质量、原创的外贸营销文案,助您征服全球市场。

下载

不要手动写 if (a == null && b == null) return 0; else if (a == null) return -1; ... ——太容易漏分支还难维护。Java 8+ 提供了标准解法:

  • 字段本身支持自然排序(如 String, Integer):用 Comparator.nullsFirst(Comparator.naturalOrder())
  • 字段是自定义类型且实现了 Comparable:同上,套一层 nullsLast() 即可
  • 字段是基本类型包装类(如 Integer),但数据库查出来可能是 null:避免用 a.getValue() - b.getValue(),改用 Comparator.nullsLast(Integer::compareTo)

中文字符串按拼音排序不是默认行为

String::compareTo 比的是 Unicode 码点,中文会按 GBK 或 UTF-16 编码顺序排,结果看起来乱序。真要按拼音首字母 A-Z 排,得用 Collator

注意 Collator.getInstance(Locale.CHINA) 返回的比较器不能直接用于 TreeSetConcurrentSkipListMap,因为它们要求比较逻辑满足“一致性”,而 Collator 的实现可能不满足严格全序(比如某些生僻字比较结果不稳定)。仅推荐用于一次性排序场景。

  • 简单拼音排序:用 Collator.getInstance(Locale.CHINA).compare(a, b) 替换 lambda 中的 a.compareTo(b)
  • 想按首字母分组再排序?先用 PinyinUtil.toPinyin(str).charAt(0)(需引入 pinyin4j)提取首字母,再按字母排序更可控
  • Web 接口返回给前端的列表,如果只是展示用,建议把排序逻辑移到数据库层(ORDER BY CONVERT(name USING gbk) 或 MySQL 8.0+ 的 COLLATE utf8mb4_unicode_ci

实际写条件排序时,最容易被忽略的是空值策略和字符集语义——这两点不出问题时一切正常,一出就是线上 NullPointerException 或用户投诉“名单顺序不对”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

670

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

329

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

282

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

517

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

259

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

388

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

536

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

631

2023.08.14

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.1万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 823人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号