使用Java 8获取属性的最大值

时间:2015-11-14 21:57:50

标签: java java-8 java-stream

我想使用Stream库重写以下代码(allPeopleList<Person>)。

int maxYear = Integer.MIN_VALUE;
Person oldest = null;
for (Person p : allPeople) {
    if (p.getDateOfDeath() > maxYear) {
        oldest = p;
        maxYear = p.getDateOfDeath();
    }
}

我试图在人员列表中找到最老的人(假设Person对象上没有Age属性,这只是一个例子)。

如何使用Java 8重写此内容?

1 个答案:

答案 0 :(得分:3)

Person oldest = allPeople.stream().max(comparingInt(Person::getDateOfDeath)).orElse(null);

此代码创建一个Person of Stream,并在比较死亡日期时选择max元素。这是通过使用Comparator.comparingInt(keyExtractor)来完成的,其中密钥提取器是对人员死亡日期的方法参考。

如果列表为空,则返回null

如评论中所述,您也可以使用Collections.max但请注意,如果列表为空,则会抛出NoSuchElementException,因此我们需要在此之前处理:

Person oldest = allPeople.isEmpty() ? null : Collections.max(allPeople, comparingInt(Person::getDateOfDeath));