【问题标题】:Getting object with max date property from list of objects Java 8从Java 8对象列表中获取具有最大日期属性的对象
【发布时间】:2015-07-27 15:23:58
【问题描述】:

我有一个名为 Contact 的类,它有一个 Date lastUpdated; 变量。

我想将Contact 从具有最大lastUpdated 变量的List<Contact> 中提取出来。

我知道这可以通过编写自定义比较器并使用 Collections.max 来完成,但我想知道是否有一种方法可以在 Java 8 中完成,不需要使用自定义比较器,因为我只想在我的代码中仅在一个位置提取具有最大日期的那个,Contact 类不应总是使用lastUpdated 变量来比较实例。

【问题讨论】:

    标签: java collections java-8


    【解决方案1】:

    用 Java-8 编写自定义比较器非常简单。使用:

    Comparator.comparing(c -> c.lastUpdated);
    

    所以如果你有List<Contact> contacts,你可以使用

    Contact lastContact = Collections.max(contacts, Comparator.comparing(c -> c.lastUpdated));
    

    或者,使用方法引用:

    Contact lastContact = Collections.max(contacts, Comparator.comparing(Contact::getLastUpdated));
    

    【讨论】:

    • 对未来读者的友好提醒:确保您预先检查该物业是否已水合(不为空)。在这种情况下,集合中的项目的 lastUpdated 不为空。
    • 如果集合为空,则会抛出 NoSuchElementException
    【解决方案2】:

    并且 Contact 类不应该总是使用 lastUpdated 变量 用于比较实例

    因此,当您想通过 lastUpdated 属性比较多个实例时,您必须提供自定义比较器,因为这意味着默认情况下此类无法与此字段进行比较。

    Comparator<Contact> cmp = Comparator.comparing(Contact::getLastUpdated);
    

    如您所知,您可以使用 Collections.max 或 Stream API 根据此字段获取最大实例,但您不能避免编写自定义比较器。

    【讨论】:

    • 哪一个(Collections.maxstream().max(Comparator&lt;T&gt;).get())性能更高?
    • @AndrewMairose 您可以测量一下,我不希望两者之间有太大差异,但只有测量值会告诉您它的准确程度。但是,如果您的数据集足够大,值得使用,则流方法可以允许您并行进行计算。
    【解决方案3】:

    尝试以下(未经测试):

    contacts.stream().max(Comparator.comparing(Contact::getLastUpdated)).get()
    

    【讨论】:

    • 这在我的用例中完美运行。必须通过 getLastModified 文件获取最后一个,在我的情况下这是一个时间戳。
    • 我总是喜欢这个。
    【解决方案4】:

    在定义合适的Comparator 后使用List&lt;T&gt;.stream().max(Comparator&lt;T&gt;).get()

    【讨论】:

      【解决方案5】:

      既然您想使用 java 8 lambdas 来做,请使用它(假设您有 List&lt;Contact&gt; contacts):

      Contact latest = contacts.stream()
           .sorted(Comparator.<Contact, Date>comparing(contact-> contact.getLastUpdated(), Comparator.reverseOrder()))
           .findFirst().get();
      

      您可以通过简单地附加更多比较器来轻松自定义此比较器。所以代码很容易修改。

      List<Contact> sortedContacts = contacts.stream()
               .sorted(Comparator.<Contact, Date>comparing(contact-> contact.getLastUpdated(), Comparator.reverseOrder())
                     .thenComparing(contact -> contact.getAge()))
               .collect(Collectors.toList());
      

      【讨论】:

      • 这不适用于大量元素。 sorted() 方法意味着 O(N log N) 复杂度,而使用 max(Comparator) 的方法(即接受的答案)具有更好的线性复杂度。换句话说,您不需要对整个集合进行排序来找到具有 max 属性的单个元素;只需要一次通过。
      猜你喜欢
      • 2017-06-29
      • 1970-01-01
      • 2022-06-15
      • 2017-09-20
      • 2015-08-11
      • 1970-01-01
      • 2018-04-13
      • 2017-06-09
      • 2019-06-29
      相关资源
      最近更新 更多