当前位置: 代码迷 >> java >> 从对象列表中获取具有最大日期属性的对象 Java 8
  详细解决方案

从对象列表中获取具有最大日期属性的对象 Java 8

热度:68   发布时间:2023-08-04 09:34:17.0

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

我想从具有最大lastUpdated变量的List<Contact>中拉出Contact

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

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

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

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

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

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

尝试以下(未经测试):

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

在定义合适的Comparator后使用List<T>.stream().max(Comparator<T>).get()

由于您想使用 java 8 lambdas 来完成它,请使用它(假设您有List<Contact> 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());
  相关解决方案