使用方法参数运行

时间:2018-04-14 10:48:55

标签: java

是否可以在Runnable中设置方法参数,如下所示:

public Runnable createRunnable(Method a_void_method) {
    Runnable runnable = new Runnable() {
        public void run() {
            //a_void_method
        }
    };
    return runnable;
}

或者有没有办法做到这一点?

4 个答案:

答案 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的方法。如果您想表示确实采用参数的方法,请考虑使用ConsumerBiConsumer

或者您可能会问如何从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; 

如果您想表示采用参数的返回空白的方法,请查看ConsumerBiConsumerspecific specialization of it