为了账号安全,请及时绑定邮箱和手机立即绑定

如何将方法作为参数传入

如何将方法作为参数传入

月关宝盒 2023-09-20 16:40:51
我有一堆基本上做同样事情的方法:根据类的不同方法返回的值选择类的前 N 个实例,所有方法都返回双精度值。例如,对于实现以下接口的类的对象:interface A {    Double getSalary();    Double getAge();    Double getHeight();}我想选择每个方法返回值最高的 N 个对象。现在我有3种方法:List<A> getTopItemsBySalary(List<A> elements);List<A> getTopItemsByAge(List<A> elements);List<A> getTopItemsByHeight(List<A> elements);它有这个身体:List<A> getTopItemsBySalary(List<A> elements, int n) {    return elements.stream()              .filter(a -> a.getSalary() != null)                               .sorted(Comparator.comparingDouble(A::getSalary).reversed())              .limit(n)              .collect(Collectors.toList());}我如何传入方法并且只有一种方法?
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

您可以使用 aFunction转换A为Double,例如:


List<A> getTopItems(List<A> elements, Function<A, Double> mapper, int n) {

    return elements.stream()

              .filter(a -> null != mapper.apply(a))                 

              .sorted(Comparator.<A>comparingDouble(a -> mapper.apply(a))

                      .reversed())

              .limit(n)

              .collect(Collectors.toList());

}

您可以使用以下方式调用它:


List<A> top10BySalary = getTopItems(list, A::getSalary, 10);

List<A> top10ByAge = getTopItems(list, A::getAge, 10);

如果您的 getter 预计始终返回非 null,那么这ToDoubleFunction是一个更好的使用类型(但如果您的返回值可能为 null,则它将不起作用Double):


List<A> getTopItems(List<A> elements, ToDoubleFunction<A> mapper, int n) {

    return elements.stream()

              .sorted(Comparator.comparingDouble(mapper).reversed())

              .limit(n)

              .collect(Collectors.toList());

}


查看完整回答
反对 回复 2023-09-20
?
哔哔one

TA贡献1854条经验 获得超8个赞

您可以将字段名称传递给通用 getTopItems 函数并使用java.beans.PropertyDescriptor


List<A> getTopItemsByField(List<A> elements, String field) {

PropertyDescriptor pd = new PropertyDescriptor(field, A.class);

Method getter = pd.getReadMethod();

return elements.stream()

          .filter(a -> getter(a) != null)                 

          .sorted(Comparator.comparingDouble(a->a.getter(a)).reversed())

          .limit(n)

          .collect(Collectors.toList());

}


查看完整回答
反对 回复 2023-09-20
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我认为你可以更改函数名称并添加 if 条件:


List<A> getTopItems(List<A> elements, int n, String byWhat) {

if (byWhat.equals("Salary"))

    return elements.stream()

              .filter(a -> a.getSalary() != null)                 

              .sorted(Comparator.comparingDouble(A::getSalary).reversed())

              .limit(n)

              .collect(Collectors.toList());

if (byWhat.equals("Height"))

    return elements.stream()

              .filter(a -> a.getHeight() != null)                 

              .sorted(Comparator.comparingDouble(A::getHeight).reversed())

              .limit(n)

              .collect(Collectors.toList());

if (byWhat.equals("Age"))

    return elements.stream()

              .filter(a -> a.getAge() != null)                 

              .sorted(Comparator.comparingDouble(A::getAge).reversed())

              .limit(n)

              .collect(Collectors.toList());


}


查看完整回答
反对 回复 2023-09-20
  • 3 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信