[英]Java Comparator with null fields
我有一個包含字段id
和createdDate
的實體Entity
列表。 我想按以下方式對它們進行排序:
id
優先id
空,則最近的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
處理實體為空時,而不是要比較的字段為空時。 我該如何處理這種情況?
我認為您正在尋找這樣的比較器,使用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
。
擴展@Mena 的評論:
java.util.Collections.sort(entities, new Comparator<Entity>(){
@Override
public int compare(Entity ent1, Entity ent2) {
Object id1=ent1.getId();
Object id2 = ent2.getId();
if (id1!=null && id2!=null)
{
return id2.compareTo(id1);
}
else
{
Date d1 = ent1.getCreatedDate();
Date d2 = ent2.getCreatedDate();
return d2.compareTo(d1);
}
}
});
使用 Object 類的 nonNull 方法,也許可以解決它。
Comparator comp = Comparator
.nullsFirst(Comparator.comparing(e -> nonNull(((Entity) e).getId()))
.thenComparing(e -> ((Entity e).getCreatedDate())
.reversed();
entities.stream().filter(comp).findFirst();
我不經常使用 lambda,但我可以幫助您使用比較器。
Comparator<Entity> cmp = new Comparator<Entity>() {
@Override
public int compare(Entity e1, Entity e2) {
if(e1.id!=null && e2.id!=null){
return e2.id - e1.id;
}
return e1.createdDate - e2.createdDate;
//createdDate should be an Integer field otherwise convert it to integer somehow.
}
};
//To use this comparator
Collections.sort(your_list,cmp);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.