Lambda表达式(1)|(List集合排序)

Lambda表达式(1)|(List集合排序)


前言

本章节主要介绍java8的新特性Lambda表达式Comparator.comparing基于List实现根据object字段的升序,倒序,为空校验,多条件排序等。

一、java8中Lambda是什么?

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符。

二、数据准备

1.创建实体

创造Object实体

  @Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class EmployeeDto {
    private String id;
    private String name;
    private String no_id;
    private String dept;
    private int year;
    private EmpInfoPo info;
}

2.初始化数据

构建List实体数据

{"dept":"研发部1","id":"001","info":{"age":25,"birth":"1990-10-12","gender":1,"like":"打篮球"},"name":"员工1号","no_id":"YF001","year":2}
{"dept":"","id":"002","info":{"age":25,"birth":"1990-10-12","gender":1,"like":"打篮球"},"name":"员工2号","no_id":"YF001","year":5}
{"id":"003","info":{"age":25,"birth":"1990-10-12","gender":1,"like":"打篮球"},"name":"员工3号","no_id":"YF001","year":7}
{"dept":"研发部4","id":"004","info":{"age":25,"birth":"1990-10-12","gender":1,"like":"打篮球"},"name":"员工4号","no_id":"YF001","year":6}
{"dept":"研发部5","id":"005","info":{"age":25,"birth":"1990-10-12","gender":1,"like":"打篮球"},"name":"员工5号","no_id":"YF001","year":4}
{"dept":"研发部6","id":"006","info":{"age":25,"birth":"1990-10-12","gender":1,"like":"打篮球"},"name":"员工1号","no_id":"YF001","year":2}

三、Lambda排序

1.排序方式对比(降序、升序)

集合方式排序、stream方式排序对比
.reversed()为将集合倒置
Comparator.reverseOrder()直接进行倒序

 public static void sortV1(List<EmployeeDto> employeeList){
        //方式一 集合方式 旧
        employeeList.sort((o1, o2) -> o1.getName().compareTo(o2.getName()));

        //方法二 集合方式
        employeeList.sort(Comparator.comparing(EmployeeDto::getYear));

        //方法三 Stream方式 排完序后倒序
        List<EmployeeDto> collect = employeeList.stream()
                .sorted(Comparator.comparing(EmployeeDto::getYear).reversed())
                .collect(Collectors.toList());

        //方法四 Stream方式 直接计算倒序
        List<EmployeeDto> collect2 = employeeList.stream()
                .sorted(Comparator.comparing(EmployeeDto::getYear,Comparator.reverseOrder()))
                .collect(Collectors.toList());

    }

2.多字段排序

对Object的多个字段进行排序
thenComparingInt 继续进行int字段的比较

     public static void sortV4(List<EmployeeDto> employeeList){
        // 方式一 集合方式
        Collections.sort(employeeList, Comparator.comparing(EmployeeDto::getName)
                .thenComparingInt(EmployeeDto::getYear));
        // 方式二 Stream方式
        List<EmployeeDto> collect = employeeList.stream()
                .sorted(Comparator.comparing(EmployeeDto::getName).thenComparingInt(EmployeeDto::getYear))
                .collect(Collectors.toList());
    }

3.空字段,空元素排序

对Object为空或者Object属性为空的数据排序
Comparator.nullsFirst() 有空的元素放在最前面
Comparator.nullsLast(String::compareTo) 有空的字段放在最后面

    public static void sortV3(List<EmployeeDto> employeeList){
        employeeList.add(null);
        // 方式一 集合方式
        Collections.sort(employeeList, Comparator.nullsFirst(Comparator.comparing(EmployeeDto::getDept)).reversed());
        // 方式二 Stream方式
        List<EmployeeDto> collect = employeeList.stream()
                .sorted(Comparator.nullsFirst(
                        Comparator.comparing(EmployeeDto::getDept,Comparator.nullsLast(String::compareTo))))
                .collect(Collectors.toList());
        print(collect);
    }

注意:当数据有空(null)的时候,如果没有使用上面函数将会报空指针异常

总结

以上就是Java8新特性Lambda表达式实现集合List排序中常见的几种场景以及可能遇到的问题。后续会慢慢完善Lambda表达式的去重遍历过滤等

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值