我想将方法作为参数传递给类似方法
callMethod(someArg, methodToPass )
在callMethod的定义中,我想称呼这个fn即。仅在此callMethod中初始化MethodToPass,即另一个Java文件中的fn MethodToPass的参数。
请告诉我该怎么做?
答案 0 :(得分:2)
这取决于您的“ methodToPass”的签名。
例如,如果您的方法接受单个参数并具有返回类型,则可以使用Function<X,Y>
:
public static <X,Y> Y callMethod (X arg, Function<X,Y> func) {
return func.apply(arg);
}
并调用:
Integer result = callMethod ("abc", String::length);
如果您的方法签名与预定义的功能接口不匹配,则可以创建自定义接口。
任一通用:
public interface MyFunc<T1,T2,T3,T4,T5>
{
public void apply (T1 t1, T2 t2, T3 t3, T4 t4, T5 t5);
}
还是不:
public interface MyFunc
{
public void apply (Type1 t1, Type2 t2, Type3 t3, Type4 t4, Type5 t5);
}
其中TypeN代表实际的类。
现在,callMethod
变为(在非通用版本中):
public static void callMethod (MyFunc method) {
Type1 a1 = ...
Type2 a2 = ...
Type3 a3 = ...
Type4 a4 = ...
Type5 a5 = ...
method.apply(a1,a2,a3,a4,a5);
}
然后用以下命令调用它:
callMethod (SomeClass::methodToPass);
methodToPass
的定义为:
static void methodToPass (Type1 t1, Type2 t2, Type3 t3, Type4 t4, Type5 t5) {
...
}
答案 1 :(得分:1)
您可以声明一个包含该方法的@FunctionalInterface
(尽管JDK已经提供了一种方法)。
@FunctionalInterface
interface MethodToPass {
void methodToCall(int someArg);
}
然后,您可以将该方法作为参考传递:
class YourClass {
// note same signature as the inferface method
public void methodToPass(iont arg) {
System.out.println("called with " + arg);
}
}
class OtherClass {
public static void main(String[] args) {
YourClass c = new YourClass();
callMethod(c::methodToPass);
}
public void callMethod(MethodToPass method) {
for (int i = 1; i < 4; i++) {
method.methodToCall(i);
}
}
}
同样,最常见的签名已经存在于JDK中-在这种情况下,它是Consumer<Integer>
。