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

时间:2016-06-04 23:40:51

标签: java lambda reference java-8 functional-interface

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

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

public class MPClient {
static final int TIME_OUT = 5000;
Client client;
MultiPlayMatch match;


public MPClient(String name, int team, MultiPlayMatch match) {
    this.match = match;
    client = new Client();
    client.start();

    Network.registerPackets(client);
    addListeners();

    try {
        client.connect(15000, Network.WIFI_IP, Network.PORT);
    } catch (IOException e) {
        e.printStackTrace();
        client.stop();
    }

    while(true) {

    }

}

private void addListeners() {
    client.addListener(new Listener.ThreadedListener(new Listener() {
        @Override
        public void connected(Connection connection) {

        }

        @Override
        public void disconnected(Connection connection) {

        }

        @Override
        public void received(Connection connection, Object object) {

        }
    }));
}
}

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

似乎我只能将遵循功能接口的方法作为参数,因此我无法使用接受多个void executeInParallel(??){ ... }构造函数的单个参数来定义executeInParallel是否存在我可以在不使用某种工厂模式的情况下完成这项工作吗?

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

提前谢谢

修改 对不起,我希望这个问题更加清晰。

1 个答案:

答案 0 :(得分: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);

// 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

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

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