Java中的回调函数
问题
有没有办法在Java方法中传递回调函数?
我试图模仿的行为是传递给函数的.Net委托。
我看到人们建议创建一个单独的对象,但这看起来有点过分,但我知道有时矫枉过正是唯一的做法。
#1 热门回答(135 赞)
如果你的意思是.NET匿名委托,我认为Java的匿名类也可以使用。
public class Main {
public interface Visitor{
int doJob(int a, int b);
}
public static void main(String[] args) {
Visitor adder = new Visitor(){
public int doJob(int a, int b) {
return a + b;
}
};
Visitor multiplier = new Visitor(){
public int doJob(int a, int b) {
return a*b;
}
};
System.out.println(adder.doJob(10, 20));
System.out.println(multiplier.doJob(10, 20));
}
}
#2 热门回答(27 赞)
从Java 8开始,有lambda和方法引用:
- Oracle Docs:Lambda表达式
- Oracle Docs:方法参考
例如,让我们定义:
public class FirstClass {
String prefix;
public FirstClass(String prefix){
this.prefix = prefix;
}
public String addPrefix(String suffix){
return prefix +":"+suffix;
}
}
和
import java.util.function.Function;
public class SecondClass {
public String applyFunction(String name, Function<String,String> function){
return function.apply(name);
}
}
然后你可以这样做:
FirstClass first = new FirstClass("first");
SecondClass second = new SecondClass();
System.out.println(second.applyFunction("second",first::addPrefix));
你可以在github上找到一个例子,这里是:julien-diener/MethodReference。
#3 热门回答(22 赞)
为简单起见,你可以使用aRunnable:
private void runCallback(Runnable callback)
{
// Run callback
callback.run();
}
用法:
runCallback(new Runnable()
{
@Override
public void run()
{
// Running callback
}
});