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)的签名不匹配.有什么建议吗?
看起来您的代码中存在语法错误.您正在尝试在匿名内部类中定义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)