首页 > 解决方案 > 将 null 函数作为参数传递给 java 函数

问题描述

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

在 StackOverflow 和 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)
        }
    }
}

有人可以帮助我清楚地了解这个主题吗?太感谢了。

标签: javafunctionclassparametersvoid

解决方案


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

例如

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它就像任何其他类(例如StringInteger等)。它不知道它表示没有值,但它知道返回的函数void没有返回值。

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

编辑:

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

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

或者,使用方法参考:

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

推荐阅读