首页 > 解决方案 > 使用java 8根据该对象的可为空的ArrayList属性对对象列表进行排序

问题描述

我正在尝试根据 java 8 中的可为空的 ArrayList 对列表进行排序。

列举如下

Patient1  visits = [02/15/2010, 02/10/2010]
Patient2  visits = [02/16/2010]
Patient3  visits = [02/17/2010, 02/10/2010]
Patient4  visits = null

我正在尝试使用流排序根据访问日期的降序(访问列表中的第一个元素)对患者对象进行排序。空值应放在最后。最终结果必须是

Patient3  visits = [02/17/2010, 02/10/2010]
Patient2  visits = [02/16/2010]
Patient1  visits = [02/15/2010, 02/10/2010]
Patient4  visits = null


Patient {
  String name;
  List<Date> visits;
}

我尝试了以下方法,但即使在空检查之后也会出现空指针异常。

   list.stream()
    .sorted(Comparator.nullsLast((Comparator.comparing(s -> s.getVisits() == null ? null : s.getVisits().get(0), Collections.reverseOrder()))))
    .collect(Collectors.toList()); 

标签: javajava-8java-stream

解决方案


您面临的问题是,如果您有对象,Comparator.nullsLast就会使用它。null Patient这不是你的情况,因为你有null访问。

你应该这样使用它:

list.stream()
    .sorted(Comparator.comparing(
            s -> s.getVisits() == null || s.getVisits().isEmpty() ? 
                 null : 
                 s.getVisits().get(0),
            Comparator.nullsLast(Collections.reverseOrder())))
    .collect(Collectors.toList()); 

推荐阅读