有没有办法在 Java 方法中传递回调函数?
我试图模仿的行为是将 .Net Delegate 传递给函数。
我见过有人建议创建一个单独的对象,但这似乎有点矫枉过正,但我知道有时矫枉过正是做事的唯一方法。
原文由 Omar Kooheji 发布,翻译遵循 CC BY-SA 4.0 许可协议
有没有办法在 Java 方法中传递回调函数?
我试图模仿的行为是将 .Net Delegate 传递给函数。
我见过有人建议创建一个单独的对象,但这似乎有点矫枉过正,但我知道有时矫枉过正是做事的唯一方法。
原文由 Omar Kooheji 发布,翻译遵循 CC BY-SA 4.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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
如果您指的是 .NET 匿名委托之类的东西,我认为也可以使用 Java 的匿名类。