我刚开始接触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;
}
}
interface ReplyMessage<T>
) - Victor2748paramsValues[idx++] = (ReplyMessage<?>) ((JsonObject reply) -> message.reply(reply));
- aioobeparamsValues[idx++] = (ReplyMessage<JsonObject>) reply -> message.reply(reply);
,因为只需要包含目标类型,没有理由使其他内容比原始解决方案更复杂。 - Holger@FunctionalInterface
的使用是可选的。此外,限制不是“仅一个方法”,而是一个抽象方法。这是一个相当大的区别。我想知道你所说的“带参数”是什么意思。如果你指的是函数,则函数有参数并且需要传递参数。 - a better oliverparamValues[idx++] = reply -> message.reply(reply);
或者
paramValues[idx++] = reply -> {
return message.reply(reply);
}
ReplyMessage<JsonObject>
是函数式接口,而且 paramValues 的类型是 ReplyMessage<JsonObject>
,它就会运作。