我正在练习Java 8.我不明白为什么这个方法总是返回0,或者更好的身份值:
public static Integer getMinAge(List<Person> peopleList) {
return peopleList.stream().mapToInt(Person::getAge).reduce(0, Integer::min);
}
令人惊讶的是,Integer :: max方法返回正确的值。我在这里做错了什么?
答案 0 :(得分:5)
因为age > 0 and identity == 0
然后Integer.min(identity,age)
总是返回0。
public static Integer getMinAge(List<Person> peopleList) {
return peopleList.stream().mapToInt(Person::getAge)
.reduce(Integer::min).orElse(0);
}
public static Integer getMinAge(List<Person> peopleList) {
return peopleList.stream().mapToInt(Person::getAge)
.min().orElse(0);
}
答案 1 :(得分:3)
问题已在评论中得到解答,但我不认为零人的最低年龄应为0
或Integer.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)