我有一个实体 Entity
列表,其中包含字段 id
和 createdDate
。我想按以下方式对它们进行排序:
- 优先
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/