如何获取具有最小属性的列表元素?

0 java java-stream java-17

我编写这段代码来找到最年轻的人:

import java.util.Comparator;
import java.util.List;

public class PersonImpl implements PersonInterface {

    @Override
    public Person youngest(List<Person> personList) {
        Integer minAge = personList.stream()
                .map(Person::getAge)
                .min(Comparator.comparing(Integer::valueOf))
                .orElse(null);
        return personList.stream()
                .filter(person -> person.getAge() == minAge)
                .toList()
                .stream()
                .findFirst()
                .orElse(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我做到了并且工作正常。现在我想知道我是否可以以更好的方式做到这一点(也许不是只对一个执行 2 个“语句”?) PS:我只提供了代码,因为我认为不需要发布所有的这里的其他课程只是为了回顾这一课程。

有人可以解释一下如何才能拥有更好的代码(更少的行)吗?谢谢

shm*_*sel 5

只需删除map()并让您的比较器进行年龄查找Person

return personList.stream()
        .min(Comparator.comparingInt(Person::getAge))
        .orElse(null);
Run Code Online (Sandbox Code Playgroud)

如果您知道列表非空,最好通过调用get()ororElseThrow()而不是 来明确这一点orElse()。或者您可以使用Collections助手而不是流:

return Collections.min(personList, Comparator.comparingInt(Person::getAge));
Run Code Online (Sandbox Code Playgroud)

顺便说一句,.toList().stream()当你已经有一个流时调用是完全没有意义的。Integer::valueOf调用也没有任何意义Integer

  • 更具体地说,您可以使用“Comparator.comparing(Function.identity())”甚至“Comparator.naturalOrder()”,而不是“Comparator.comparing(Integer::valueOf)”。但在这种特定情况下,您可以使用 `int minAge = personList.stream() .mapToInt(Person::getAge) .min() .orElse(-1);` 这也可以解决它不是的问题对于读者来说,后续的“person.getAge() == minAge”是否正确是显而易见的。如果“getAge()”的返回类型是“Integer”(我们无法知道),这将是一个引用比较。对于“int minAge”,它显然是一个数字比较。 (2认同)