将空函数作为参数传递给 java 函数

Passing a null function to java function as argument

我在理解如何将函数作为参数传递给方法时遇到问题。

通过在 Whosebug 和 StackExchange 上搜索,我找到了使用 java.util.Functions

的解决方案
public void someFunction(Functions <int[], int[]> myFunction);

(来源:https://codereview.stackexchange.com/questions/186972/passing-a-generic-function-as-parameter

虽然这个解决方案对我来说似乎不错,但当我需要传递一个什么都不做的函数时,我遇到了问题。为了更好地理解,请考虑以下示例:

public class Example {
    //do stuffs
    myFunction(null);
}

public class Manager {
    public void myFunction(Function<int[], void> funcToPass) { // Can't specify void as return value!
        //do stuff
        if(funcToPass != null) { // can't replicate such behaviour
            funcToPass(someParams)
        }
    }
}

谁能帮我弄清楚这个话题?非常感谢。

如果要描述一个没有return值的函数,可以使用Void类型。这是一个标准 Java class,但旨在用于这种情况。

例如

Function<String, Void> stringPrinter = s -> {
    System.out.println(s);
    return null;  // must return some value, null is acceptable since there is no Void instance
};

return null; 很重要,因为从编译器的角度来看,Void 就像任何其他 class(例如 StringInteger , ETC)。它不知道它表示没有值,而它知道 returns void 的函数没有 return 值。

这意味着编译器仍然希望您的代码中有一些 return 语句,就好像它是 returning 一个 Integer,所以您必须 return null;

编辑:

但是,如果严格处理没有 return 的函数,您可能会发现更适合使用 Consumer<T>。例如:

Consumer<String> stringPrinter = s -> System.out.println(s);
stringPrinter.accept("hello");

或者,使用方法参考:

Consumer<String> stringPrinter = System.out::println;
stringPrinter.accept("hello");

您可以使用反射 API 传递 void 方法作为参考,例如

import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) throws Exception {
        Class[] classParams = new Class[1];
        classParams[0] = String.class;
        Method method = Main.class.getMethod("hello", classParams);
        Main obj = new Main();
        System.out.println(new Main().getSum(obj, method, "world!", 10, 20));
    }

    public void hello(String msg) {
        System.out.println("Hello " + msg);
    }

    int getSum(Object object, Method method, String msg, int x, int y) throws Exception {
        Object[] objectParams = new Object[1];
        objectParams[0] = msg;
        method.invoke(object, objectParams);
        return x + y;
    }
}

输出:

Hello world!
30