Java方法参考(将方法作为参数传递)

时间:2018-10-10 06:49:46

标签: java java-8 method-reference

我想将方法​​作为参数传递给类似方法

callMethod(someArg, methodToPass

在callMethod的定义中,我想称呼这个fn即。仅在此callMethod中初始化MethodToPass,即另一个Java文件中的fn MethodToPass的参数。

请告诉我该怎么做?

2 个答案:

答案 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>