Java 开发 - 含有 null 值字段的对象排序(自定义 Comparator、使用 Comparator、使用 Stream API)

准备阶段

  • Student.java
java 复制代码
public class Student {
    private Integer id;
    private String name;

    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

基础排序

  1. 升序排序
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(1003, "王五"));
list.add(new Student(1002, "李四"));

list.sort(Comparator.comparingInt(Student::getId));

System.out.println(list);
复制代码
# 输出结果

[Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1003, name='王五'}]
  1. 降序排序
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(1003, "王五"));
list.add(new Student(1002, "李四"));

list.sort((o1, o2) -> o2.getId() - o1.getId());

System.out.println(list);
复制代码
# 输出结果

[Student{id=1003, name='王五'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}]

含有 null 值字段的对象排序

1、自定义 Comparator
  1. 升序排序,含有 null 值字段的对象放在最后面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

list.sort((o1, o2) -> {
    Integer id1 = o1.getId();
    Integer id2 = o2.getId();

    if (id1 == null && id2 == null) {
        return 0;
    }
    if (id1 == null) {
        return 1;
    }
    if (id2 == null) {
        return -1;
    }
    return id1 - id2;
});

System.out.println(list);
复制代码
# 输出结果

[Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
  1. 降序排序,含有 null 值字段的对象放在最后面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

list.sort((o1, o2) -> {
    Integer id1 = o1.getId();
    Integer id2 = o2.getId();

    if (id1 == null && id2 == null) {
        return 0;
    }
    if (id1 == null) {
        return 1;
    }
    if (id2 == null) {
        return -1;
    }
    return id2 - id1;
});

System.out.println(list);
复制代码
# 输出结果

[Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
  1. 升序排序,含有 null 值字段的对象放在最前面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

list.sort((o1, o2) -> {
    Integer id1 = o1.getId();
    Integer id2 = o2.getId();

    if (id1 == null && id2 == null) {
        return 0;
    }
    if (id1 == null) {
        return -1;
    }
    if (id2 == null) {
        return 1;
    }
    return id1 - id2;
});

System.out.println(list);
复制代码
# 输出结果

[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}]
  1. 降序排序,含有 null 值字段的对象放在最前面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

list.sort((o1, o2) -> {
    Integer id1 = o1.getId();
    Integer id2 = o2.getId();

    if (id1 == null && id2 == null) {
        return 0;
    }
    if (id1 == null) {
        return -1;
    }
    if (id2 == null) {
        return 1;
    }
    return id2 - id1;
});

System.out.println(list);
复制代码
# 输出结果

[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}]
2、使用 Comparator
  1. 升序排序,含有 null 值字段的对象放在最后面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

list.sort(
        Comparator.comparing(
                Student::getId,
                Comparator.nullsLast(Comparator.naturalOrder())
        )
);

System.out.println(list);
复制代码
# 输出结果

[Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
  1. 降序排序,含有 null 值字段的对象放在最后面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

list.sort(
        Comparator.comparing(
                Student::getId,
                Comparator.nullsLast(Comparator.reverseOrder())
        )
);

System.out.println(list);
复制代码
# 输出结果

[Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
  1. 升序排序,含有 null 值字段的对象放在最前面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

list.sort(
        Comparator.comparing(
                Student::getId,
                Comparator.nullsFirst(Comparator.naturalOrder())
        )
);

System.out.println(list);
复制代码
# 输出结果

[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}]
  1. 降序排序,含有 null 值字段的对象放在最前面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

list.sort(
        Comparator.comparing(
                Student::getId,
                Comparator.nullsFirst(Comparator.reverseOrder())
        )
);

System.out.println(list);
复制代码
# 输出结果

[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}]
3、使用 Stream API
  1. 升序排序,含有 null 值字段的对象放在最后面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

List<Student> sortedList = list.stream()
        .sorted(Comparator.comparing(
                Student::getId,
                Comparator.nullsLast(Comparator.naturalOrder())
        ))
        .collect(Collectors.toList());

System.out.println(sortedList);
复制代码
# 输出结果

[Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
  1. 降序排序,含有 null 值字段的对象放在最后面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

List<Student> sortedList = list.stream()
        .sorted(Comparator.comparing(
                Student::getId,
                Comparator.nullsLast(Comparator.reverseOrder())
        ))
        .collect(Collectors.toList());

System.out.println(sortedList);
复制代码
# 输出结果

[Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}, Student{id=null, name='王五'}, Student{id=null, name='赵六'}]
  1. 升序排序,含有 null 值字段的对象放在最前面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

List<Student> sortedList = list.stream()
        .sorted(Comparator.comparing(
                Student::getId,
                Comparator.nullsFirst(Comparator.naturalOrder())
        ))
        .collect(Collectors.toList());

System.out.println(sortedList);
复制代码
# 输出结果

[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1001, name='张三'}, Student{id=1002, name='李四'}, Student{id=1005, name='孙七'}]
  1. 降序排序,含有 null 值字段的对象放在最前面
java 复制代码
List<Student> list = new ArrayList<>();

list.add(new Student(1001, "张三"));
list.add(new Student(null, "王五"));
list.add(new Student(1002, "李四"));
list.add(new Student(null, "赵六"));
list.add(new Student(1005, "孙七"));

List<Student> sortedList = list.stream()
        .sorted(Comparator.comparing(
                Student::getId,
                Comparator.nullsFirst(Comparator.reverseOrder())
        ))
        .collect(Collectors.toList());

System.out.println(sortedList);
复制代码
# 输出结果

[Student{id=null, name='王五'}, Student{id=null, name='赵六'}, Student{id=1005, name='孙七'}, Student{id=1002, name='李四'}, Student{id=1001, name='张三'}]
相关推荐
峥嵘life1 小时前
Android16 311Y3 EAP-TLS 网络连接失败分析与修复总结
android·开发语言·人工智能·php
M-Robots echo1 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
不可求~2 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
mldong3 小时前
用 DDD 设计工作流引擎:聚合根与充血模型
java·架构
mqiqe4 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一514 小时前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依
gugucoding4 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
何事误红尘4 小时前
全志A40i学习笔记():开发资料、启用串口
学习
Nebula_g4 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__5 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习