当前位置: 首页 > 知识库问答 >
问题:

使用java 8根据对象的可空ArrayList属性对对象列表进行排序

爱炯
2023-03-14

我试图排序基于一个nullable ArrayList在java 8列表。

列表如下

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

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

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()); 

共有3个答案

薛承基
2023-03-14

您可以使用本机Java

Collections.sort(/*list name*/visits, /*elements from list*/(l, r) -> /*example logic*/l.date.compareTo(r.date));
龙俊良
2023-03-14

你应该试试这样:

    Optional.ofNullable(list).map(list - > list.stream().filter(property == null)).orElse(null);

这样你就不会试图在一个空对象上使用。

梁丘霖
2023-03-14

您面临的问题是比较器。如果您有nullPatient对象,则将使用null slast。这不是你的情况,因为你有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()); 
 类似资料:
  • 我是Java流的新手,我只想对我的对象的键进行排序。 所以,我尝试了这样的方法,效果很好 这是根据我想要的分类。 但我得到的结果在

  • 假设我有一个自定义对象的ArrayList,例如 如何按路径、格式、大小或日期添加对其进行排序? 谢了!

  • 我有一个对象列表,我需要按其中一个对象属性对其进行排序。 我可以用下面的代码按升序排序 但是,这是按升序排序列表,而我需要做的是按降序排序。在对对象列表进行排序时,这可能吗?

  • 问题内容: 我想按对象的指定属性对对象列表进行排序,并希望选择用于排序的属性。例: 这个想法很简单: 我将要排序的所有值都放入一个数组中,并创建了一个映射,将这些值映射回它们的对象。对这个数组进行排序后,我将映射到这些值的对象按相同的顺序放入一个新数组中,然后按这些值对它们进行排序。这些值只是使用Object类型创建的,因此我可以按多种类型(不仅仅是示例中的Strings)进行排序。 除非您有两个

  • 问题内容: 我有一个对象的ArrayList。该对象包含属性和。所以我想对上的对象进行排序,对于同一日期的所有对象,我想对其进行排序。我怎样才能做到这一点? 问题答案: 实施自定义,然后使用。它可能看起来像这样:

  • 我的要求是检索所有image(WAHImage)对象,无论标本(标本Impl)是否为空,无论分类单元名称(WACensusImpl)是否为空,并按标本名称或分类单元名称(如果可用)对结果进行排序,首先显示具有空标本和空分类单元名称的image对象。 使用下面的代码,我得到一个错误found for type wAHimage。 很明显,QueryDSL还不完全支持我的用例,即查询实体并根据其可为空