问题描述
我有一个名为Contact
的类,它有一个Date lastUpdated;
多变的。
我想从具有最大lastUpdated
变量的List<Contact>
中拉出Contact
。
我知道这可以通过编写自定义比较器并使用Collections.max
来完成,但我想知道是否有一种方法可以在不需要使用自定义比较器的 Java 8 中完成,因为我只想拉一个在我的代码中只有一个位置具有最大日期,并且Contact
类不应该总是使用lastUpdated
变量来比较实例。
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));
2楼
并且 Contact 类不应该总是使用 lastUpdated 变量来比较实例
因此,每当您想通过lastUpdated
属性比较多个实例时,您都必须提供自定义比较器,因为这意味着默认情况下该类无法与此字段进行比较。
Comparator<Contact> cmp = Comparator.comparing(Contact::getLastUpdated);
如您所知,您可以使用Collections.max
或 Stream API 根据此字段获取最大实例,但您无法避免编写自定义比较器。
3楼
尝试以下(未经测试):
contacts.stream().max(Comparator.comparing(Contact::getLastUpdated)).get()
4楼
在定义合适的Comparator
后使用List<T>.stream().max(Comparator<T>).get()
。
5楼
由于您想使用 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());