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

时间:2014-05-12 20:35:08

标签: 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();

我想开始使用Lambda表达式简化部分代码。所以我开始使用:

重写上面的例子
SocketServer server = SocketFactory.create().addListener(8888, "localhost")
            .setHandler(new SocketHandler() {
               exchange -> {
                  exchange.send("Hello World");
               }

}).create();

然而Eclipse(支持JDK1.8的Luna)抱怨方法句柄(..)没有实现。然而,使用句柄方法正是我想要避免实现的方法.... 知道怎么解决它?
谢谢!

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

@FunctionalInterface

public interface SimpleFuncInterface extends  SocketHandler{

     void handle(ServerExchange exchange) throws Exception;

}

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

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

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


}

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

2 个答案:

答案 0 :(得分:7)

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

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

如果方法setHandler过载,可能需要提供更多信息,例如通过添加演员:

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

答案 1 :(得分:0)

使用Eclipse Mars或NetBeans 8,您可以快速修复 - >转换为lambda表达式。 (如果你使用java 8)。 亲切的问候