按列表中某些对象缺少的对象字段对列表进行排序

时间:2019-07-08 05:00:20

标签: java sorting null comparator

我需要显示一个帐户对象列表,并在其中一个帐户对象字段(所有字符串类型)上进行排序。但是,某些帐户字段的值为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",然后  有效。

1 个答案:

答案 0 :(得分:5)

您可以决定将所有null放在列表的开头或结尾,并分别使用Comparator.nullsFirstComparator.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()));
}