Java 8方法引用了多个不同的构造函数

kxi*_*rog 2 java lambda reference java-8 functional-interface

我正在尝试编写一个方法,该方法接受Runnable类的构造函数并根据输入的构造函数以某种方式运行它.

所以我希望能够做到这样的事情:

executeInParallel(someRunnable::new)
executeInParallel(someOtherRunnable::new)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何定义executeInParallel方法,以便能够传递我在参数中定义的任何Runnable构造函数?基本上我的问题是为了做到这一点我该如何定义这个方法? void executeInParallel(??){ ... }

看来我只能将函数接口的方法作为参数,所以我不能executeInParallel用一个接受多个xRunnable::new构造函数的参数来定义我是否有办法在不使用某种工厂的情况下执行此操作图案?

我想说明我想要这样做的原因是我想传递构造函数而不是实例.我不能在executeInParallel之外生成实例,它必须在该方法内生成.我还想传递不同的构造函数,这些构造函数采用不同的参数

先感谢您

编辑 对不起,我希望这个问题更加清晰.

Oli*_*ier 5

你的executeInParallel()方法接受会生成Runnable的东西,所以它的签名应该是executeInParallel(Supplier<? extends Runnable> runnableFactory)

然后,您可以使用任何lambda或方法引用来调用它,该引用可以返回任何实现的类的实例Runnable.

可能的用法:

// Ex 1 :
class MyJob implements Runnable { 
    public void run() {...} 
}
executeInParallel(() -> new MyJob());
executeInParallel(MyJob::new);
Run Code Online (Sandbox Code Playgroud)

 

// Ex 2 :
class MyJobWithParams implements Runnable {
    public MyJobWithParams(String param1, int param2) { ... }
    public void run() {...} 
}
executeInParallel( () -> new MyJobWithParams("Hello",42) );
// You cannot use method references here
Run Code Online (Sandbox Code Playgroud)

 

// Ex 3 : 
class RunnableFactory {
    public static Runnable makeRunnable() {
        return new MyJob(); // which is a Runnable, see above
    }
}
executeInParallel( () -> RunnableFactory.makeRunnable() );
executeInParallel( RunnableFactory::makeRunnable );
Run Code Online (Sandbox Code Playgroud)

此外,您声明您只希望将Runnable构造函数传递给该方法.这可以通过方法引用(但仅适用于无参数构造函数)或通过lambda表达式(如上面的示例#1和#2)来完成.