Java Lambda表情结束我的SocketConversation

Java Lambda表情结束我的SocketConversation,java,lambda,java-8,Java,Lambda,Java 8,我有一个测试应用程序,它可以生成大量与服务器的SocketConversation。在过去,我会添加一个名为ClosedWhenDone的接口,或者定义一个close方法并在中传递一个实例,通知调用类SocketConversation已完成 我是Java8新手,想自学lambda函数。我已经看过这些:、和 因此,根据我的研究,我在构造函数中添加了一个参数: private Predicate<SocketConversation> closePredicate; pri

我有一个测试应用程序,它可以生成大量与服务器的SocketConversation。在过去,我会添加一个名为ClosedWhenDone的接口,或者定义一个close方法并在中传递一个实例,通知调用类SocketConversation已完成

我是Java8新手,想自学lambda函数。我已经看过这些:、和

因此,根据我的研究,我在构造函数中添加了一个参数:

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表达式的好应用程序。