Стиль программирования Java 8, который предпочитали мои коллеги, - это связывание асинхронных вызовов на всем протяжении, например,
CompletionStage<E> someMethod() {
return doSomething().thenCompose(a -> {
// ...
return b;
}).thenCompose(b -> {
// ...
return c;
}).thenCompose(c -> {
// ...
return d;
}).thenApply(d -> {
// ...
return e;
});
}
У меня есть что-то подобное выше, но с дополнительной проблемой:Мне нужно вспомнить значения, полученные в некоторых лямбдах, в более поздних лямбдах.Например,
CompletionStage<E> someMethod() {
return doSomething().thenCompose(a -> {
// ...
Foo foo = fooDAO.getFoos(a);
// ...
return b;
}).thenCompose(b -> {
// ...
return c;
}).thenCompose(c -> {
// ...
Bar bar = barDAO.getBars(foo);
// ...
return d;
}).thenApply(d -> {
// ...
return someResult(d, bar);
});
}
Когда я объявляю Foo foo;
и Bar bar;
во внешней области, я получаю ошибки о том, что они не являются окончательными или фактически окончательными.И я читал об использовании обертки, чтобы сделать их эффективно окончательными, но мне кажется довольно глупым сделать это (я не понимаю, почему это разрешено ...)
Я читал, что Java 8 не сделаладобавить поддержку для кортежей (хотя он рассматривал BiVal
, который, возможно, я мог бы использовать, чтобы передать BiFunction
лямбда-выражения).Поэтому я попытался использовать пары, например
return doSomething().thenCompose(a -> {
// ...
Foo foo = fooDAO.getFoos(a);
// ...
return new Pair<>(foo, b);
}).thenCompose(fooAndB -> {
, а затем везде, где мне нужно было вспомнить foo
,
Foo foo = fooAndB.getKey();
Но это выглядит так семантически неправильно.Кроме того, это не работает!Я не знаю почему, потому что я думал, что область действия лямбда-параметра такая же, как и его внешняя область действия, и поэтому все параметры лямбды будут доступны из последующих лямбд-цепочек.
Что на самом делеобъем лямбда-параметров, и есть ли идиоматический или, по крайней мере, семантически не оскорбительный способ сделать то, что я хотел бы сделать, сохраняя цепочку?
Ответы, основанные на разрыве цепочки, хороши, как они могутбыть полезным для будущих зрителей, но в моем случае отклонения от доминирующего стиля в этом репо могут привести к затяжным пиар-разговорам и задержке одобрения, поэтому я бы хотел, чтобы решение сохраняло цепочку.Или объяснение или демонстрация того, как безумно было бы пытаться сохранить цепочку.Спасибо!