具有空字段的 Java 比较器

标签 java sorting java-8 java-stream

我有一个实体 Entity 列表,其中包含字段 idcreatedDate。我想按以下方式对它们进行排序:

  • 优先id
  • 如果 id 为 null,则最近的 createdDate 优先

我尝试了以下失败,因为它在 id 为 null 时抛出 NullPointerException

Comparator comp = Comparator
                .nullsFirst(Comparator.comparing(e -> ((Entity) e).getId()))
                .thenComparing(e -> ((Entity e).getCreatedDate())
                .reversed();
entities.stream().sorted(comp).findFirst();

就我所见,Comparator.nullsFirst 在实体为 null 时处理,而不是在要比较的字段为 null 时处理。我该如何处理这种情况?

最佳答案

我认为您正在寻找这样的比较器,使用 Comparator.nullsLast :

Comparator<MyClass> comparator = Comparator.comparing(MyClass::getId, Comparator.nullsLast(Comparator.reverseOrder()))
                .thenComparing(MyClass::getCreateDate);

测试代码:

List<MyClass> list = new ArrayList<>();

list.add(new MyClass(null, LocalDate.now()));
list.add(new MyClass(4L, LocalDate.now()));
list.add(new MyClass(2L, LocalDate.now()));
list.add(new MyClass(4L, LocalDate.now().plusDays(1)));
list.add(new MyClass(null, LocalDate.now().plusDays(1)));

Comparator<MyClass> comparator = Comparator.comparing(MyClass::getId, Comparator.nullsLast(Comparator.reverseOrder()))
                .thenComparing(MyClass::getCreateDate);

list.stream().sorted(comparator).forEach(myClass -> System.out.println(myClass.id + " " + myClass.createDate));

输出是:

4 2019-06-14
4 2019-06-15
2 2019-06-14
null 2019-06-14
null 2019-06-15

如果您希望 nulls 排在第一位,只需将 nullsLast 更改为 nullsFirst .

关于具有空字段的 Java 比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56598709/

相关文章:

java - 如何使用 java 8 处理可空列表?

java - 数据库 [默认] 未找到驱动程序 - Playframework 1.4.x 中的 MySQL

java - 如何获取Web应用程序的war文件的路径?

java - 通过 Java 套接字发送带有 <APPLET> 标记的 html 文件

java - 如何使Java应用程序分配的内存可编辑?

c++ - STL排序算法

java - 按两个标准排序以获得最终结果

php - 计算 php 数组 : How to improve my Algorithm? 内可能的解决方案

java - 当在Java中加载jni dll时,JDK 1.8 UnsatisfiedLinkError

java - 如果目录不存在则根据点串包名创建目录