Java Lambda表情结束我的SocketConversation
我有一个测试应用程序,它可以生成大量与服务器的SocketConversation。在过去,我会添加一个名为ClosedWhenDone的接口,或者定义一个close方法并在中传递一个实例,通知调用类SocketConversation已完成 我是Java8新手,想自学lambda函数。我已经看过这些:、和 因此,根据我的研究,我在构造函数中添加了一个参数:Java Lambda表情结束我的SocketConversation,java,lambda,java-8,Java,Lambda,Java 8,我有一个测试应用程序,它可以生成大量与服务器的SocketConversation。在过去,我会添加一个名为ClosedWhenDone的接口,或者定义一个close方法并在中传递一个实例,通知调用类SocketConversation已完成 我是Java8新手,想自学lambda函数。我已经看过这些:、和 因此,根据我的研究,我在构造函数中添加了一个参数: private Predicate<SocketConversation> closePredicate; pri
private Predicate<SocketConversation> closePredicate;
private long delay;
private boolean done;
private int index;
public SocketConversation(URI uri, int idx, String line, long delay, Predicate<SocketConversation> predicate) {
index = idx;
socket = new AirSocketClient(uri, this);
closePredicate = predicate;
...
}
但是,此处的关闭会生成一个错误:
The method close(SocketConversation) is undefined for the type Predicate<SocketConversation>
类型谓词的方法close(SocketConversation)未定义
我遗漏了什么?听起来你想要的是一个回调,通过调用调用方指定的代码,让调用方知道对话已经完成。这听起来像是lambdas的完美用法。在“旧”时代(Java8之前),您需要指定一些接口,调用方将传入一个匿名内部类的实例。这可以很容易地用lambda代替 您可以定义自己的接口,但在本例中不需要这样做,因为大多数简单接口都已定义。在这种情况下,回调传递一个
SocketConversation
的实例,并且不返回任何内容。这个函数接口是一个使用者
,它已经在java.util.function
包中定义。它是通用的,因此您需要一个消费者
。你的班级看起来像这样:
private Consumer<SocketConversation> callback;
public SocketConversation(URI uri, int idx, String line, long delay, Consumer<SocketConversation> callback) {
this.callback = callback;
...
}
SocketConversation conv = new SocketConversation(uri, idx, line, delay,
sc -> System.out.println("conversation " + sc + " is done"));
调用者可以将lambda表达式作为回调传递,如下所示:
private Consumer<SocketConversation> callback;
public SocketConversation(URI uri, int idx, String line, long delay, Consumer<SocketConversation> callback) {
this.callback = callback;
...
}
SocketConversation conv = new SocketConversation(uri, idx, line, delay,
sc -> System.out.println("conversation " + sc + " is done"));
谓词没有close()方法的事实:。我不明白您为什么要向这个方法传递谓词。@JBNizet。我现在对谓词有了更多的了解。我想在这种情况下,我会在JavaScript中使用闭包,所以我不需要创建一个interace。我认为有一种方法可以使用lambda函数来实现这一点,并认为就是这样。那么,在本例中,有没有一种方法可以实现我所寻找的谓词不是吗?定义一个CloseWhenDone接口,就像您在了解lambda表达式之前所做的那样。如果它只有一个抽象方法,调用方将能够使用lamda表达式创建CloseWhenDone实例。@JBNizet因此这不是lambda表达式的好应用程序。