Java 8计算最小值

时间:2017-03-26 12:38:09

标签: java java-8

我正在练习Java 8.我不明白为什么这个方法总是返回0,或者更好的身份值:

public static Integer getMinAge(List<Person> peopleList) {
    return peopleList.stream().mapToInt(Person::getAge).reduce(0, Integer::min);
}

令人惊讶的是,Integer :: max方法返回正确的值。我在这里做错了什么?

3 个答案:

答案 0 :(得分:5)

因为age > 0 and identity == 0然后Integer.min(identity,age)总是返回0。

使用IntStream.reduce(IntBinaryOperator)

public static Integer getMinAge(List<Person> peopleList) {
  return peopleList.stream().mapToInt(Person::getAge)
            .reduce(Integer::min).orElse(0);
}

使用IntStream.min()

public static Integer getMinAge(List<Person> peopleList) {
  return peopleList.stream().mapToInt(Person::getAge)
           .min().orElse(0);
}

答案 1 :(得分:3)

问题已在评论中得到解答,但我不认为零人的最低年龄应为0Integer.MAX_INT。我更喜欢:

public static Integer getMinAge(List<Person> peopleList) {
    return peopleList.stream().mapToInt(Person::getAge).min().getAsInt();
}

min()是最简洁的解决方案,它会强制您考虑空流的角落情况。在您的情况下,我将其视为程序员错误并抛出异常。

答案 2 :(得分:0)

因为您呼叫reduce(0, Integer::min),0本身是人们年龄列表中的最小数字。您可以参考java doc of IntStream.recude了解更多详情。如果您需要找到最年轻的人,则需要将其称为reduce(Integer.MAX_VALUE, Integer::min)