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
    }
});