У меня есть последовательность Mono
преобразований с использованием flatMap
.Мне удалось упростить мой производственный код до этого контрольного примера:
@Test
public void test() {
AtomicInteger iCounter = new AtomicInteger(1);
Mono<String> iValueMono = Mono.fromSupplier(() -> {
int iValue = iCounter.getAndIncrement();
System.out.println("iValueMono CALL: " + iValue);
return String.valueOf(iValue);
});
Mono<String> resultMono = Mono.just("X")
.flatMap(append(iValueMono))
.flatMap(append(iValueMono));
StepVerifier.create(resultMono)
.consumeNextWith(result -> assertThat(result).isEqualTo("X11"))
.expectComplete()
.verify();
}
private Function<String, Mono<String>> append(Mono<String> sMono) {
return s -> sMono.map(v -> s + v);
}
Это печатает:
iValueMono CALL: 1
iValueMono CALL: 2
org.junit.ComparisonFailure:
Expected :"X11"
Actual :"X12"
Я подумал - теперь я вижу, что это неправильно - что каждый раз, когда я отображаюiValueMono
в вызове append()
поставщик выполняется повторно для получения нового значения.Я не могу изменить в производственном коде, как реализован iValueMono
(например, чтобы сохранить состояние для сохранения значения).Как я могу реализовать это так, чтобы поставщик значений вызывался только один раз, и я получал конечный результат «X11»?
Конечно, меня интересует неблокирующий, реактивный способ сделать это.