У меня есть несколько методов, которые отображаются на запросы сервера. Запросы используют promises (из Play Framework), чтобы возвращать ответы в будущем. Вот пример одного из моих действий:Лямбда-нотация - попытка рефакторинга, но получение проблем
public static Promise<Result> someAction() {
MyBean data = new MyBean(getData(request().body()));
Promise<MyReq> promise = Promise.promise(() -> new MyReq(data));
return promise.map((MyReq req) -> ok(req.getResponse()));
}
Обратите внимание, что MyReq
расширяет MyAbstractReq<T>
.
То, что я надеялся сделать, состоял в том, чтобы убрать весь общий код из всех методов действий и расслоить его на один общий метод handleRequest
. Однако я стараюсь понять Лямбда-нотацию и не могу изменить код в соответствии с моими целями.
Я понимаю, что () -> new MyReq(data)
в основном означает (arg1, arg2, ...) -> { body }
, которое можно записать как (я думаю):
MyBean data = new MyBean(getData(request().body()));
// Anonymous Functional Interface
MyFunction f = new MyFunction() {
@Override
public void getReq(){
return new MyReq(data);
}
};
Или что-то подобное.
Но что я пытаюсь достичь это что-то вроде этого (не компилируется, но я надеюсь, что это дает достаточно идеи, что я пытаюсь добиться):
public static Promise<Result> handleRequest(MyAbstractReq<?> req) {
Promise<MyAbstractReq<?>> promise = Promise.promise(() -> req);
return promise.map(() -> ok(req.getResponse()));
}
и каждый внешний вид действий как это:
public static Promise<Result> someAction() {
MyBean data = new MyBean(getData(request().body()));
return handleRequest(new MyReq(data));
}
может кто-то пожалуйста, указать на то, что это такое, что мне не хватает в отношении лямбда-нотации и объяснить, как я могу добиться того, что я пытаюсь сделать.
Update
Ошибки я получаю
Lambda expression's signature does not match the signature of the functional interface method apply(? super MyAbstractReq<?>)
Я предполагаю, что это потому, что синтаксис был неправильным, это была только моя первая наивная попытка реорганизовать Это.
Метод req.getResponse()
не очень актуальны, поскольку это просто создает объект JSON (ObjectNode - Джексон быстрее XML), который может потребляться методом ok()
создать Result
Update 2
С что касается использования handleRequest(MyAbstractReq<T> req)
У меня на самом деле было это, но ошибка была в основном одинаковой.
Lambda expression's signature does not match the signature of the functional interface method apply(? super MyAbstractReq<T>)
Update 3
Я прошу прощения.Ошибка находится на линии return promise.map(() -> ok(req.getResponse()));
Update 4
я, вероятно, следовало бы отметить, что я знаю, как решить эту проблему путем изменения метода handleRequest()
к:
public static Promise<Result> handleRequest(MyAbstractReq<?> req) {
Promise<MyAbstractReq<?>> promise = Promise.promise(() -> req);
return promise.map((MyAbstractReq<?> notUsed) -> ok(req.getResponse()));
}
Но он чувствует себя неправильно поскольку строка return promise.map((MyAbstractReq<?> notUsed) -> ok(req.getResponse()));
принимает аргумент MyAbstractReq<?>
, который никогда не используется.
Я не понимаю достаточно об обозначениях лямбда-выражений, чтобы сказать, что это не лучший способ добиться того, чего я хочу (я не упоминал об этом, так как я хотел видеть, какие предложения людей будут без меня ведущими их ответ).
В чем проблема? Есть ли ошибка? Где определяется метод 'getResponse()'? –
Я обновил вопрос, чтобы ответить на ваши комментарии. Что касается того, что он имеет отношение к выражениям лямбда, я пытаюсь реорганизовать лямбда-выражения, но я не знаю, как это сделать. Ошибки указывают на наличие ошибки в сигнатуре выражения Lambda. – Neilos
Если мой вопрос непонятен, то я был бы признателен, если бы вы могли сказать мне, какие части вы не понимаете, чтобы я мог прояснить. – Neilos