Java8 对象List 排序

目录

1.stream流式排序

1.使用说明:

2.多字段排序

[2.Collections.sort(......) 排序](#2.Collections.sort(......) 排序)


1.stream流式排序

Java8提供了流式操作来简化我们的编程,比如排序、分组、过滤、Map操作等API,配合Lambda表达式给我们编程带来了很大的便利,这篇文章重点介绍Stream流式排序功能--> list.stream().sorted(......)。

功能说明:能够使用自然序,或着实现Comparator 函数接口来自定义排序规则。

1.使用说明:

  • 自然序排序stream().sorted(),List中的元素需要实现Comparable 接口,例如String,通常我们自己定义的类是没有实现这个接口的。
  • 自定义排序stream().sorted(Comparator<? super T> comparator),如果我们自定义的类没有实现Comparable接口,那么就可以使用这种方式,使用Lambada 来创建一个Comparator (函数接口)实例,并且可以根据需要进行升序、降序排列

官网简单示例:

复制代码
#自然序排序一个list
list.stream().sorted() 
 
#自然序逆序元素,使用Comparator 提供的reverseOrder() 方法
list.stream().sorted(Comparator.reverseOrder()) 
 
# 使用Comparator 来排序一个list
list.stream().sorted(Comparator.comparing(Student::getAge)) 
 
# 颠倒使用Comparator 来排序一个list的顺序,使用Comparator 提供的reverseOrder() 方法
list.stream().sorted(Comparator.comparing(Student::getAge).reversed())

2.多字段排序

通过Comparator.thenComparing(Comparator<? super T> comparator) 实现

1.简单字符串排序(数字排序也一样)

先以客户编码排序,再以产品信息排序

复制代码
        List<Customer> customerListNew = customerList.stream()
            .sorted(Comparator.comparing(Customer::getCustomerCode)
                  .thenComparing(Customer::getProductSeries)
            ).collect(Collectors.toList());

2.区分升序和降序

  • 通过Comparator.thenComparing(Comparator<? super T> other) 实现多字段排序
  • 使用Comparator.reverseOrder() 做为thenComparing方法的参数,实现降序

先以年龄的升序排序,再以地域降序Comparator.reverseOrder()

复制代码
List<Customer> customerListNew = customerList.stream()
  .sorted(Comparator.comparing(Customer::getAge)
    .thenComparing(Customer::getArea, Comparator.reverseOrder())
  ).collect(Collectors.toList());

3.字符串转数字排序

有的情况下,需要将字符串转为数字进行排序,这时候该怎么办呢?使用Lambda表达式.

.thenComparing(t -> {}) 中的Lambda表达式可能会失去java类型,这时候需要在开始的时候加上强制类型转换 Comparator.comparing( (Customer s) -> {......} )

复制代码
//按照Type, Name进行排序
List<Customer> sceneListNew = sceneList.stream()
.sorted(Comparator.comparing((Customer s) -> {
    if(StringUtils.isEmpty(s.getTypeSeq())) return 0;
    return Integer.valueOf(s.getTypeSeq());
}).thenComparing(t -> {
    if(StringUtils.isEmpty(t.getNameSeq())) return 0;
    return Integer.valueOf(t.getNameSeq());}
)).collect(Collectors.toList());

2.Collections.sort(......) 排序

也要用到Lambda表达式。

下面也给出一个需要将String转为Integer进行比较的例子

复制代码
Collections.sort(stageList, (mgStage1, mgStage2) -> {
    if (null == mgStage1.getStageSeq()){
        return 1;
    }
    if (null == mgStage2.getStageSeq()){
        return -1;
    }
    return Integer.parseInt(mgStage1.getStageSeq()) - Integer.parseInt(mgStage2.getStageSeq());
});
相关推荐
wuminyu28 分钟前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
callJJ2 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
海兰2 小时前
【第27篇】Micrometer + Zipkin
人工智能·spring boot·alibaba·spring ai
wbs_scy3 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
海兰3 小时前
【第28篇】可观测性实战:LangFuse 方案详解
人工智能·spring boot·alibaba·spring ai
jinanwuhuaguo4 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
RuoyiOffice4 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
spring boot·后端·vue·anti-design-vue·ruoyioffice·假期·人力
xmjd msup5 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952365 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.5 小时前
优惠券秒杀业务分析
java·开发语言