如何将函数作为方法参数传递



我有两种方法来获得女性的平均年龄,第二种方法是获得男性的平均年龄。我需要做一种方法来协调这两种方法。

这个方法作为第一个参数应该有人的列表,作为第二个参数函数,它将决定我们是在寻找男性还是女性的平均年龄。

这是我的方法:

public double getMenAverageAge(List<Person> personList){
return Optional.ofNullable(personList)
.orElseGet(ArrayList::new)
.stream()
.filter(Objects::nonNull)
.filter(p -> !Boolean.parseBoolean(String.valueOf(p.getFirstName().endsWith("a"))))
.mapToDouble(Person::getAge)
.average()
.orElse(0);
}
public double getAverageWomenAge(List<Person> personList){
return Optional.ofNullable(personList)
.orElseGet(ArrayList::new)
.stream()
.filter(Objects::nonNull)
.filter(p-> Boolean.parseBoolean(String.valueOf(p.getFirstName().endsWith("a"))))
.mapToDouble(Person::getAge)
.average()
.orElse(0);
}

有什么想法吗?

Predicate<Person> p = p-> Boolean.parseBoolean(String.valueOf(p.getFirstName().endsWith("a")));

Predicate<Person>只是一种类型。以上与CCD_ 2没有太大区别。您可以创建一个方法,接受该类型作为param:

public double getAverageAge(List<Person> list, Predicate<Person> filter) {
return list
.stream()
.filter(filter) 
.mapToDouble(Person::getAge)
.average()
.orElse(0);

注意:你有null tourette,这是一个编写大量无法测试的代码的公式。不要这么做。喜欢NPE。对于有人调用此方法为列表传递null的正确响应是使用NPE崩溃:null最好被视为"未设置"/"未知",并且不可能获得未知列表的平均年龄。答案不是0。答案是(ツ)/。

同样,如果某个null以某种方式进入了你的人员列表,那么这个人的年龄也是未知的。当其中一个人完全未知时,不可能确定一批人的平均年龄,同样,NPEing实际上是正确的反应。

在java中处理null的最好方法是使用对您有利的工具:如果NullPointerException实际上是可能发生的最好的事情,那么您做得对。

最新更新