我们在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)的签名不匹配。有什么建议吗?
答案 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)。 亲切的问候