Mono flatMap + switchIfEmpty Combo Operator? - PullRequest
       87

Mono flatMap + switchIfEmpty Combo Operator?

1 голос
/ 23 января 2020

Есть ли оператор, который позволяет обрабатывать результат / успех независимо от того, является ли Mono пустым. Например:

Mono<Bar> result = sourceMono.flatMap(n -> process(n)).switchIfEmpty(process(null));

где:

Mono<Bar> process(Foo in){
Optional<Foo> foo = Optional.ofNullable(in);
...
}

есть ли оператор быстрого доступа, который допускает что-то похожее ниже или подобное?

Mono<Bar> result = sourceMono.shortCut(process);

В частности, mono.someOperator() возвращает Optional<Foo>, который будет содержать null, когда Mono пуст и имеет значение в противном случае.

Я хотел бы избежать создания метода процесса, как упомянуто выше, и просто иметь блок кода, но не уверен, какой оператор может помочь без дублирования блока.

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Нет встроенного оператора, который бы выполнял именно то, что вы хотите.

В качестве обходного пути вы можете преобразовать Mono<Foo> в Mono<Optional<Foo>>, который выдает пустой Optional<Foo> вместо завершения пустого , а затем оперируйте с испущенным Optional<Foo>.

Например:

Mono<Bar> result = fooMono            // Mono<Foo>
    .map(Optional::of)                // Mono<Optional<Foo>> that can complete empty
    .defaultIfEmpty(Optional.empty()) // Mono<Optional<Foo>> that emits an empty Optional<Foo> rather than completing empty
    .flatMap(optionalFoo -> process(optionalFoo.orElse(null)));
1 голос
/ 23 января 2020

В соответствии с описанным выше обходным путем @ phil, здесь есть функция многократного использования:

private final <T> Mono<Optional<T>> afterSucess(Mono<T> source) {
    return source
       .map(Optional::of) //
       .defaultIfEmpty(Optional.empty());
}

, затем вызовите в строке издателя:

Foo<Bar> result = fooMono
    .transformDeferred(this::afterSucess)
    .flatMap(optionalFoo -> process(optionalFoo.orElse(null)));
...