在Java中,如何将一个函数作为另一个函数的参数传递
Java 8及以上版本
使用Java 8+lambda表达式,如果您的类或接口只有一个抽象方法(有时称为aSAM类型),例如:
公共接口MyInterface{
字符串doSomething(int参数1,字符串参数2);
}
然后,在使用MyInterface的任何地方,都可以替换lambda表达式:
类MyClass{
公共MyInterface MyInterface=(p1,p2)->;{返回p2+p1;};
}
例如,您可以非常快速地创建新线程:
新线程(()->;someMethod()).start();
并使用方法引用语法使其更清晰:
新线程(this::someMethod).start();
如果没有lambda表达式,最后两个示例如下所示:
新线程(new Runnable(){someMethod();}).start();
Java 8之前
一种常见的模式是将其“包装”在接口中,例如Callable,然后传入一个Callable:
公共T myMethod(可调用<;T>;func){
返回函数调用();
}
此模式称为命令模式
请记住,最好为您的特定用途创建一个接口。如果您选择使用callable,那么您将使用您期望的任何类型的返回值(如String)替换上面的T
对于您在下面的评论,您可以说:
public int methodToPass(){
//做点什么
}
public void dansMethod(int i,可调用<;Integer>;myFunc){
//做点什么
}
然后调用它,可能使用匿名内部类:
dansMethod(100,新的可调用<;Integer>;(){
公共整数调用(){
返回methodToPass();
}
});
请记住,这不是一个“把戏”。它只是java与函数指针的基本概念等价物