我有一个使用这些属性定义的类Person
:
private String name;
private String surname;
private Date birthday;
我希望以Collection<Person>
获得生日的最大值。
在 Java 7 中,没有外部库,我会这样做:
public Date maxAgeJava7(Collection<Person> persons) {
Date max = null;
for (Person person : persons) {
if (max == null || person.getBirthday().after(max)) {
max = person.getBirthday();
}
}
return max;
}
现在,在 Java 8 中,可以这样写:
public Date maxAgeJava8(Collection<Person> persons) {
return persons.stream().map(Person::getBirthday).max((Date d1, Date d2)-> d1.compareTo(d2)).get();
}
这好多了但是我不喜欢这部分:
(Date d1, Date d2)-> d1.compareTo(d2)
作为日期implements Comparable
,有没有办法告诉Java使用compareTo()
方法,而不必明确地写它?
答案 0 :(得分:5)
max
需要Comparator
作为参数。
我认为您可以做的最简单的事情是使用方法引用调用方法compareTo
。
public Date maxAgeJava8(Collection<Person> persons) {
return persons.stream().map(Person::getBirthday).max(Date::compareTo).get();
}
另请注意,您无需使用Stream
即可完成此操作。您只需使用Collections.max
提供自定义比较器:
public Date maxAgeJava8(Collection<Person> persons) {
return Collections.max(persons, Comparator.comparing(Person::getBirthday)).getBirthday();
}