如何将这段代码转换为Java8 Lambda

4

我刚开始接触Java 8,对这段代码有些困惑:

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

如何将此转换为Lambda风格?


有没有在线转换工具? - IndexOutOfDevelopersException
3个回答

4
如果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;
    }
}

接口应该具有通用类型(interface ReplyMessage<T> - Victor2748
1
@LouisWasserman,没错。我只是想为了教育目的更详细地说明一下。 - aioobe
1
感谢@MarcoAcierno :) - aioobe
在我的情况下,'paramsValues' 定义如下:Object[] paramsValues = new Object[params.length];因此我得到了一个编译错误: “此表达式的目标类型必须是一个功能接口” - Shvalb
2
试试这个:paramsValues[idx++] = (ReplyMessage<?>) ((JsonObject reply) -> message.reply(reply)); - aioobe
1
为什么不使用paramsValues[idx++] = (ReplyMessage<JsonObject>) reply -> message.reply(reply);,因为只需要包含目标类型,没有理由使其他内容比原始解决方案更复杂。 - Holger

1
Lambda表达式仅适用于函数式接口(只有一个方法的接口,例如RunnableActionEvent)。
如果ReplyMessage是一个函数式接口,您可以执行以下操作:
paramsValues[idx++] = reply -> message.reply(reply);

Lambda表达式的形式为:方法应该接受的参数,然后是->,然后是方法体。
这是ReplyMessage接口应该看起来的代码:
@FunctionalInterface
interface ReplyMessage<T> {
    void reply(T jo);
}

如需更多信息,请阅读this


@FunctionalInterface 的使用是可选的。此外,限制不是“仅一个方法”,而是一个抽象方法。这是一个相当大的区别。我想知道你所说的“带参数”是什么意思。如果你指的是函数,则函数有参数并且需要传递参数。 - a better oliver

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

或者

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

只要 ReplyMessage<JsonObject> 是函数式接口,而且 paramValues 的类型是 ReplyMessage<JsonObject>,它就会运作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接