我们正在使用一些在Java中使用广泛的socket API,它们大量使用ActionListeners。例如:
现在我的代码长这样:
代码现在似乎没有错误,但编译器报错说Lambda表达式的签名与函数接口方法handle(ServerExchange)的签名不匹配。有什么建议吗?
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