将函数指针传递给方法

我已经阅读了一些有关函数指针的文章,但我仍然不了解如何针对我的情况最好地使用“函数指针”。同样在这种情况下,我还不清楚使用匿名类...

代码在这里:

class fitness {
  private List < Double > list;
  interface Foo {
    //public Foo;
    Object myFunc(Object arg);
    Object myFunc2(Object arg);
  }
  public fitness(List < Double > list) {
    this.list = new ArrayList < Double > (list);
  }
  public void bar(Foo foo) {
    Object object = foo.myFunc(list);
    System.out.println(object);

    Object object2 = foo.myFunc2(list);
    System.out.println(object2);
  }
  public void method(String func) {
    if (func.equals("f1"))
      bar(
        new Foo() {
          public Object myFunc(Object arg) {
            return (Double)((List) arg).get(0) + 50.0;
          }
          public Object myFunc2(Object arg) {
            return (Double)((List) arg).get(0) + 50.0;
          }
        });
    else if (func.equals("f2"))
      bar(
        new Foo() {
          public Object myFunc(Object arg) {
            List < Double > l = (List < Double > ) arg;
            return l.get(0) / l.size();
          }
          public Object myFunc2(Object arg) {
            List < Double > l = (List < Double > ) arg;
            return l.get(0) / l.size();
          }
        });

  }
  public void fitness1() {
    bar(
      new Foo() {
        public Object myFunc(Object arg) {
          return (Double)((List) arg).get(0) + 50.0 * 1000;
        }
        public Object myFunc2(Object arg) {
          return (Double)((List) arg).get(0) + 50.0;
        }
      });
  }
}

class Example {
  public static void main(String[] args) {
    ArrayList < Double > listD = new ArrayList < Double > ();
    listD.add(100.0);
    listD.add(-1.0);
    listD.add(-5.0);
    fitness t = new fitness(listD);
    //t.method("f1");
    //t.method("f2");
    //t.method2();
    t.fitness1();
  }
}

我想要的是一个对象fitness,它根据一些参数调用了健身功能。适应性方法应能够获取int,double甚至偶数的列表。

我想做一个测试:所以如果我选择f1,f2,f3,f4,我想看看不同的结果。我对如何编码感到困惑。

预先感谢

zhoubingpei 回答:将函数指针传递给方法

您可以声明以下接口:

interface FooFunc {
    Object invoke(Foo foo,Object arg);
}

然后稍微更改bar()方法:

public void bar(Foo foo,FooFunc func) {
    Object object = func.invoke(foo,list);
    System.out.println(object);
}

...以及您的Fitness1()方法:

public void fitness1(FooFunc func) {
    bar(
            new Foo() {
        public Object myFunc(Object arg) {
            return (Double) ((List) arg).get(0) + 50.0 * 1000;
        }

        public Object myFunc2(Object arg) {
            return (Double) ((List) arg).get(0) + 50.0;
        }
    },func);
}

现在,从main()方法中,您可以执行以下操作:

    Fitness t = new Fitness(listD);
    t.fitness1(Fitness.Foo::myFunc);
    t.fitness1(Fitness.Foo::myFunc2);

不是很好吗?

更新:完整文件

import java.util.ArrayList;
import java.util.List;

class Fitness {

    private List<Double> list;

    interface Foo {

        //public Foo;
        Object myFunc(Object arg);

        Object myFunc2(Object arg);
    }

    interface FooFunc {
        Object invoke(Foo foo,Object arg);
    }

    public Fitness(List<Double> list) {
        this.list = new ArrayList<Double>(list);
    }

    public void bar(Foo foo,FooFunc func) {
        Object object = func.invoke(foo,list);
        System.out.println(object);
    }

    public void fitness1(FooFunc func) {
        bar(
                new Foo() {
            public Object myFunc(Object arg) {
                return (Double) ((List) arg).get(0) + 50.0 * 1000;
            }

            public Object myFunc2(Object arg) {
                return (Double) ((List) arg).get(0) + 50.0;
            }
        },func);
    }
}

public class Example {

    public static void main(String[] args) {
        ArrayList<Double> listD = new ArrayList<>();
        listD.add(100.0);
        listD.add(-1.0);
        listD.add(-5.0);
        Fitness t = new Fitness(listD);
        t.fitness1(Fitness.Foo::myFunc);
        t.fitness1(Fitness.Foo::myFunc2);
    }
}
本文链接:https://www.f2er.com/1411416.html

大家都在问