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

6
我们正在使用一些在Java中使用广泛的socket API,它们大量使用ActionListeners。例如:
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)报错,指出方法handle(..)未实现。但是我正想避免实现handle方法,有任何想法可以解决这个问题吗?
谢谢!

更新: 感谢您的回复。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表达式的签名与函数接口方法handle(ServerExchange)的签名不匹配。有什么建议吗?

为什么不按答案中提出的方式编写代码呢?请使用 exchange -> exchange.send("Hello World") 而不是 () -> exchange.send("Hello World")。您的空括号表明该函数不带参数,但实际上有一个类型为 ServerExchange 的参数必须被命名,无论您将其命名为 e 还是 exchange - Holger
2个回答

8

看起来你的代码中有语法错误。你试图在匿名内部类中定义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();

假设 SocketHandler 是一个功能接口而不是抽象类,那看起来就没问题了。 - Stuart Marks
感谢您的回复。我已经更新了原始请求,将SocketHandler封装在一个函数接口中。但是仍然无法验证Lambda表达式... - user2824073
@user2824073:请展示一下 SocketHandler 的定义以及 setHandler 的签名。 - nosid
公共接口SocketHandler {void handle(ServerExchange exchange) throws Exception;} - user2824073
@user2824073:你尝试过我的答案中的代码,不包括 SimpleFuncInterfacedoWork 吗?Eclipse 显示了什么错误信息? - nosid
显示剩余3条评论

1

如果您使用Java 8,可以使用Eclipse Mars或NetBeans 8进行快速修复->转换为Lambda表达式。亲切的问候。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接