как избежать .flatMap (x-> реактивное действие (x) .thenReturn (x)) - PullRequest
1 голос
/ 07 апреля 2020

Во время некоторого реактивного программирования в Java с использованием проектной библиотеки реактора я наткнулся на шаблон, для которого мне интересно, есть ли поддержка из коробки?

Поэтому я хочу, чтобы приведенный ниже код:

Mono.just("hello")
    .flatMap(hello -> reactiveAction(hello).thenReturn(hello))
    ..
    .;

превратился во что-то вроде:

Mono.just("hello")
    .coolOperation(this::reactiveAction)
    ..
    .;   

Я не могу использовать doOnNext, потому что я хочу сделать внутри реактивное действие не является побочным эффектом. и реактивные действия:

Mono<Integer> reactiveAction(String text){
  return ....
}

Ответы [ 3 ]

4 голосов
/ 09 апреля 2020

Рассматривали ли вы Mono#delayUntil?

Mono.just("hello")
    .delayUntil(hello -> reactiveAction(hello))
    ..
    .;
1 голос
/ 09 апреля 2020

РЕДАКТИРОВАТЬ: см. Ответ @bsideup, похоже, что delayUntil может соответствовать требованиям.

Мой оригинальный ответ в качестве альтернативного предложения:

Я не думаю, что есть любой запеченный в синтаксисе c сахар для этого, так как "выполняет асинхронную c операцию, которая зависит от оригинала onNext" - это само определение flatMap. На самом деле мы добавили thenReturn(foo) как syntacti c сахар над .then(Mono.just(foo)).

Если вы хотите еще больше сократить код, предложите альтернативу reactiveAction, которая также возвращает исходное значение:

Mono<String> reactiveActionBackground(String text){
  return reactiveAction(text).thenReturn(text);
}

, который затем может быть вызван непосредственно на flatMap, а не через transform:

Mono.just("hello")
    .flatMap(this::reactiveActionBackground);
1 голос
/ 07 апреля 2020

Я не могу найти встроенное решение, но вы можете создать служебную функцию:

public static <T> Function<Mono<T>, Publisher<T>> coolOperation(
        Function<T, Mono<?>> companionMonoFunction) {
    return originalMono -> originalMono
            .flatMap(t -> companionMonoFunction.apply(t)
                    .thenReturn(t));
}

И теперь вы можете использовать его с transform или transformDeffered:

Mono.just("hello")
    .transform(coolOperation(this::reactiveAction))
    ...;

Но для меня это не выглядит намного красивее:)

...