我需要显示一个帐户对象列表,并在其中一个帐户对象字段(所有字符串类型)上进行排序。但是,某些帐户字段的值为null
,因此不会显示在JSON
中。在对那些缺失的字段进行排序时,它给了我null pointer exception
。如何让Comparator
在排序过程中忽略缺少的字段?
我尝试了Comparator.comparing()
,但是它仅适用于公共字段(所有帐户对象中都存在)。如果我尝试对帐户对象之一中缺少的字段进行排序。 NullPointerExceptio
n发生了。当然,如果我试图强制所有字段以空字符串值(“”)的形式显示,那么它可以正常工作,但看起来不太好,因为这些字段可能太多。
帐户定义
@JsonInclude(Include.NON_NULL)
private String type;
@JsonInclude(Include.NON_NULL)
private String accountNumber;
@JsonInclude(Include.NON_NULL)
private String accountStatus;
@JsonInclude(Include.NON_NULL)
private String accountValue;
....
排序以下列表-只有类型和accountNumber是通用的
"accounts": [
{
"type": "type1",
"accountNumber": "1816227",
"accountStatus": "cancelled",
},
{
"type": "type2",
"accountNumber": "2816218",
"accountValue": "19438.60",
},
{
"type": "type3",
"accountNumber": "2209890",
"accountStatus": "inactive",
"accountValue": "4343.410",
}
if (sortField.equalsIgnoreCase("type")) {
accountComparator = Comparator.comparing(Accounts::getType);
}else if(sortField.equalsIgnoreCase("accountNumber")) {
accountComparator = Comparator.comparing(Accounts::getAccountNumber);
}else if(sortField.equalsIgnoreCase("accountStatus")) {
accountComparator = Comparator.comparing(Accounts::getAccountStatus);
}else if(sortField.equalsIgnoreCase("accountValue")) {
accountComparator = Comparator.comparingDouble(acc ->
Double.valueOf(acc.getAccountValue()));
}
......
Nullpointer exception
在下一行,当Sort
上的accountStatus
并且
accountValue
个帐户之一中缺少。
totalAcctList.sort(accountComparator.reversed());
如前所述,如果我让所有帐户显示accountStatus
并且
accountValue
,例如“ accountStatus”:“”和"accountValue":"0.0"
,然后
有效。
答案 0 :(得分:5)
您可以决定将所有null
放在列表的开头或结尾,并分别使用Comparator.nullsFirst
或Comparator.nullsLast
:
else if (sortField.equalsIgnoreCase("accountStatus")) {
accountComparator =
Comparator.comparing(Accounts::getAccountStatus,
Comparator.nullsLast(Comparator.naturalOrder()));
}
编辑:
对于accountValue
,您可以采用类似的方法,尽管由于原始double
不能为null
,所以在尝试解析之前,您必须首先处理它们:>
else if (sortField.equalsIgnoreCase("accountValue")) {
accountComparator =
Comparator.comparing((Account a) -> a.getAccountValue() == null)
.thenComparingDouble((Account a) ->
Double.parseDouble(a.getAccountValue()));
}