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