在动作侦听器中使用Lambda表达式

use*_*073 6 java lambda java-8

我们在Java中使用了一些广泛使用ActionListeners的套接字API.例如:

SocketServer server = SocketFactory.create().addListener(8888, "localhost")
                .setHandler(new SocketHandler() {

                    public void handle(final ServerExchange exchange)
                            throws Exception {
                        exchange.send("Hello World");
                    }
                }).create();
Run Code Online (Sandbox Code Playgroud)

我想开始使用Lambda表达式简化部分代码.所以我开始使用以下方法重写上面的例子:

SocketServer server = SocketFactory.create().addListener(8888, "localhost")
            .setHandler(new SocketHandler() {
               exchange -> {
                  exchange.send("Hello World");
               }

}).create();
Run Code Online (Sandbox Code Playgroud)

但Eclipse(支持JDK1.8的Luna)抱怨方法句柄(..)没有实现.然而,使用handle方法正是我想要避免实现的....任何想法我该如何解决它?
谢谢!

更新:感谢您的回复.好的SocketHandler是一个接口,但我现在将它包装在功能界面中,如下所示:

@FunctionalInterface

public interface SimpleFuncInterface extends  SocketHandler{

     void handle(ServerExchange exchange) throws Exception;

}
Run Code Online (Sandbox Code Playgroud)

现在我的代码看起来像这样:

SocketServer  server = SocketFactory.create().addListener(8080, "localhost")
                .setHandler(doWork(() -> exchange.send("Hello World"))).create();    

        server.start();
}
private static void doWork(SimpleFuncInterface itf) {


}
Run Code Online (Sandbox Code Playgroud)

代码现在似乎没有错误,但是编译器抱怨Lambda表达式签名与功能接口方法句柄(ServerExchange)的签名不匹配.有什么建议吗?

nos*_*sid 8

看起来您的代码中存在语法错误.您正在尝试在匿名内部类中定义lambda表达式.但是,您应该使用lambda表达式而不是匿名内部类.我想以下工作:

SocketServer server = SocketFactory.create().addListener(8888, "localhost")
    .setHandler(e -> { e.send("Hello World"); }).create();
Run Code Online (Sandbox Code Playgroud)

如果方法setHandler过载,可能需要提供更多信息,例如通过添加强制转换:

SocketServer server = SocketFactory.create().addListener(8888, "localhost")
    .setHandler((SocketHandler) e -> { e.send("Hello World"); }).create();
Run Code Online (Sandbox Code Playgroud)