如何解决将函数指针传递给方法
我已经阅读了一些有关函数指针的文章,但我仍然不了解如何针对我的情况最好地使用“函数指针”。同样在这种情况下,我还不清楚使用匿名类...
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,我想看看不同的结果。我对如何编码感到困惑。
预先感谢
解决方法
您可以声明以下接口:
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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。