从Java 8对象列表中获取具有max date属性的对象

从Java 8对象列表中获取具有max date属性的对象,java,collections,java-8,Java,Collections,Java 8,我有一个名为Contact的类,它有一个最新更新的日期变量 我想从包含maxlastUpdated变量的列表中拉出联系人 我知道这可以通过编写一个自定义比较器并使用Collections.max来实现,但我想知道是否有一种方法可以在Java 8中实现这一点,而不需要使用自定义比较器,因为我只想在代码中的一个位置提取一个具有最大日期的比较器,而且Contact类不应该总是使用lastUpdated变量来比较实例。用Java-8编写自定义比较器非常简单。使用: Comparator.comparin

我有一个名为
Contact
的类,它有一个
最新更新的日期变量

我想从包含max
lastUpdated
变量的
列表中拉出
联系人


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

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

Comparator.comparing(c -> c.lastUpdated);
因此,如果您有联系人列表,您可以使用

Contact lastContact = Collections.max(contacts, Comparator.comparing(c -> c.lastUpdated));
或者,使用方法引用:

Contact lastContact = Collections.max(contacts, Comparator.comparing(Contact::getLastUpdated));
定义合适的
比较器后,使用
List.stream().max(比较器).get()

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

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

Comparator<Contact> cmp = Comparator.comparing(Contact::getLastUpdated);
Comparator cmp=Comparator.comparing(Contact::GetLastUpdate);
正如您所知,您可以使用
Collections.max
或流API根据此字段获取max实例,但您不能避免编写自定义比较器。

尝试以下操作(未经测试):


由于您希望使用java 8 lambdas进行此操作,请使用此选项(假设您有
列表联系人
):

Contact latest=contacts.stream()
.sorted(Comparator.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());
List sortedContacts=contacts.stream()
.sorted(Comparator.comparing(contact->contact.getLastUpdated(),Comparator.reverseOrder())
.Then比较(contact->contact.getAge())
.collect(Collectors.toList());

是一个或另一个(
Collections.max
还是
stream().max(Comparator.get()
)性能更高?@andrewmairse您可以测量一下,我不希望两者之间有太大的差异,但只有测量结果才能告诉您它到底有多高。然而,如果您的数据集足够大,值得使用,那么流方法可以允许您并行进行计算。必须通过getLastModified文件获取最后一个,这在我的情况下是一个时间戳。我总是喜欢这样。友好地提醒未来的读者:确保您预先检查属性是否水合(非空)。在这种情况下,集合中的项的lastUpdated不为null。如果集合为空,则会引发NoSuchElementException
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());