将空函数作为参数传递给 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(例如 String
、Integer
, 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
我在理解如何将函数作为参数传递给方法时遇到问题。
通过在 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(例如 String
、Integer
, 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