如何将此代码转换为 java8 lambda

How to convert this code to java8 lambda

我刚刚开始使用 Java 8,但我正在为这个代码片段而苦苦挣扎:

paramsValues[idx++] = new ReplyMessage<JsonObject>() {
    @Override
    public void reply(JsonObject reply) {
        message.reply(reply);
    }
};

如何将其转换为 Lambda 样式?

如果ReplyMessage是一个功能接口,你可以

paramsValues[idx++] = reply -> message.reply(reply);

这是一个完整的示例,其中包含您问题中另一个 类 的存根实现:

// Stub classes
class JsonObject { }

@FunctionalInterface
interface ReplyMessage<T> {
    void reply(T jo);
}

class LambdaDemo {
    public static void main(String args[]) {

        // Dummy variables
        ReplyMessage<JsonObject> message = new ReplyMessage<JsonObject>() {
            public void reply(JsonObject jo) {}
        };
        ReplyMessage[] paramsValues = new ReplyMessage[5];
        int idx = 0;

        // Your code, lambdafied
        paramsValues[idx++] = reply -> message.reply(reply);

        // Or,
        // paramsValues[idx++] = message::reply;

        // But then you could perhaps do with just ...
        // paramsValues[idx++] = message;
    }
}

Lambda 表达式仅适用于 Functional Interfaces(只有一种方法的接口,例如 RunnableActionEvent)

如果ReplyMessage是一个函数式接口,你可以这样做:

paramsValues[idx++] = reply -> message.reply(reply);

Lambda 表达式以这种模式形成:方法应该采用的参数,然后是 -> 然后是方法主体

下面是 ReplyMessage 界面的代码:

@FunctionalInterface
interface ReplyMessage<T> {
    void reply(T jo);
}

有关详细信息,请考虑阅读 this

paramValues[idx++] = reply -> message.reply(reply);

或者

paramValues[idx++] = reply -> {
    return message.reply(reply);
}

只要 ReplyMessage<JsonObject> 是函数式接口并且 paramValues 是 ReplyMessage<JsonObject> 类型,它就可以工作。