有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将空函数作为参数传递给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)
        }
    }
}

有人能帮我弄清楚这个话题吗?非常感谢你


共 (2) 个答案

  1. # 1 楼答案

    如果要描述不返回值的函数,可以使用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");
    
  2. # 2 楼答案

    您可以使用反射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