Java 中的回调函数

新手上路,请多包涵

有没有办法在 Java 方法中传递回调函数?

我试图模仿的行为是将 .Net Delegate 传递给函数。

我见过有人建议创建一个单独的对象,但这似乎有点矫枉过正,但我知道有时矫枉过正是做事的唯一方法。

原文由 Omar Kooheji 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 446
2 个回答

如果您指的是 .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));

    }
}

原文由 Gant 发布,翻译遵循 CC BY-SA 3.0 许可协议

从 Java 8 开始,有 lambda 和方法引用:

例如,如果你想要一个功能接口 A -> B ,你可以使用:

 import java.util.function.Function;

public MyClass {
    public static String applyFunction(String name, Function<String,String> function){
        return function.apply(name);
    }
}

以下是您如何称呼它:

 MyClass.applyFunction("42", str -> "the answer is: " + str);
// returns "the answer is: 42"

您也可以传递类方法。例如:

 @Value // lombok
public class PrefixAppender {
    private String prefix;

    public String addPrefix(String suffix){
        return prefix +":"+suffix;
    }
}

然后你可以这样做:

 PrefixAppender prefixAppender= new PrefixAppender("prefix");
MyClass.applyFunction("some text", prefixAppender::addPrefix);
// returns "prefix:some text"

注意

这里我使用了功能接口 Function<A,B> ,但是包中还有很多其他的 java.util.function 。最值得注意的是

  • Supplier : void -> A
  • Consumer : A -> void
  • BiConsumer : (A,B) -> void
  • Function : A -> B
  • BiFunction : (A,B) -> C

以及许多其他专门研究某些输入/输出类型的。然后,如果它没有提供您需要的,您可以创建自己的 FunctionalInterface

 @FunctionalInterface
interface Function3<In1, In2, In3, Out> { // (In1,In2,In3) -> Out
    public Out apply(In1 in1, In2 in2, In3 in3);
}

使用示例:

 String computeAnswer(Function3<String, Integer, Integer, String> f){
    return f.apply("6x9=", 6, 9);
}

computeAnswer((question, a, b) -> question + "42");
// "6*9=42"

你也可以用抛出的异常来做到这一点:

 @FunctionalInterface
interface FallibleFunction<In, Out, Ex extends Exception> {
    Out get(In input) throws Ex;
}
public <Ex extends IOException> String yo(FallibleFunction<Integer, String, Ex> f) throws Ex {
    return f.get(42);
}

原文由 Juh_ 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题