是否可以在Runnable
中设置方法参数,如下所示:
public Runnable createRunnable(Method a_void_method) {
Runnable runnable = new Runnable() {
public void run() {
//a_void_method
}
};
return runnable;
}
或者有没有办法做到这一点?
答案 0 :(得分:2)
您正在创建的Runnable
与其他任何匿名,嵌套的类都不同。因此,你可以通过任何有效的决赛。对象引用它。在您的情况下,Method
引用就可以了。
然而,Method
需要一个实例或class
来操作,否则该方法不知道要调用哪种多态方法,也不知道要传递哪种数据。
如果您的Java版本是8之前的版本,则需要将对象实例传递给createRunnable
:
public Runnable createRunnable(Object instance, Method method) {
return new Runnable() {
try {
method.invoke(instance);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// handle exception
throw new RuntimeException(e);
}
};
)
在Java-8及更高版本中,您可以使用lambda方法引用,无需创建函数:
Runnable r = () -> {
try {
method.invoke(instance);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// handle exception
throw new RuntimeException(e);
}
};
或者,如果你已经知道方法和实例,你也可以使用
Runnable r = object::method;
答案 1 :(得分:1)
Runnable
表示不带参数并返回void
的方法。如果您想表示确实采用参数的方法,请考虑使用Consumer
和BiConsumer
。
或者您可能会问如何从Consumer
转换为Runnable
,请尝试以下操作:
private static <T> Runnable toRunnable(Consumer<? super T> consumer, T parameter) {
return () -> consumer.accept(parameter);
}
答案 2 :(得分:0)
如果您确实通过反思获得public class Q1 {
public static void main(String[] args) {
int[] testArr = {12, 32, 45, 435, -1, 345, 0, 564, -10, 234, 25};
System.out.println();
System.out.println(find(testArr, 0, testArr.length - 1, testArr[0]));
}
public static int find(int[] arr, int currPos, int lastPos, int elem) {
if (currPos == lastPos) {
return elem;
} else {
if (elem < arr[currPos]) {
return find(arr, currPos + 1, lastPos, elem);
} else {
return find(arr, currPos + 1, lastPos, arr[currPos]);
}
}
}
}
,
Method
否则,您可能正在寻找lambdas,尤其是method references:
public void run() {
a_void_method.invoke(instance_to_invoke_on);
// or if method is static,
// a_void_method.invoke(null);
}
答案 3 :(得分:0)
你可以使用Runnable来表示一个不带参数的void返回方法。
public Runnable createRunnable(Runnable a_void_method) {
Runnable runnable = new Runnable() {
public void run() {
a_void_method.run();
}
};
return runnable;
}
或更紧凑的形式:
public Runnable createRunnable(Runnable a_void_method) {
return () -> a_void_method.run();
}
或使用方法参考。
public Runnable createRunnable(Runnable a_void_method) {
return a_void_method::run;
}
此外,您甚至可能不需要在方法中包含a_void_method
的逻辑,而是可以直接内联分配它:
Runnable runnable = ClassName::a_void_method;
如果您想表示采用参数的返回空白的方法,请查看Consumer或BiConsumer或specific specialization of it。