Как повторно использовать переменную в нескольких операторах Mono? - PullRequest
1 голос
/ 16 апреля 2019

[возможно, дубликат, но я пока не нашел]

Рассмотрим этот код:

Mono.just(myVar)
    .flatMap(MyClass::heavyOperation)
    .flatMap(MyClass::anotherHeavyOperation)
    .flatMap(res -> doSomething(res, MyClass.heavyOperation(myVar)));

Я не хочу звонить дважды MyClass.heavyOperation(myVar) с одним и тем же входом ради производительности.

Как я могу повторно использовать результат второй операции в четвертой? Я хочу сделать что-то вроде этого, что запрещено:

Object myObj;
Mono.just(myVar)
    .flatMap(var -> {
               myObj = MyClass.heavyOperation(var);                  
               return myObj;
               })
    .flatMap(MyClass::anotherHeavyOperation)
    .flatMap(res -> doSomething(res, myObj));

Ответы [ 4 ]

3 голосов
/ 16 апреля 2019

Вероятно, лучшее решение - поместить все, что использует myObj, в один шаг конвейера.

Как это:

Mono.just(myVar)
    .flatMap(MyClass::heavyOperation)
    .flatMap(myObj -> MyClass.anotherHeavyOperation(myObj)
        .flatMap(res -> doSomething(res, myObj)));

Шаг, использующий myObj, в свою очередь может быть разбит на несколько меньших под-конвейеров.

2 голосов
/ 16 апреля 2019

Вы можете создать кортеж на второй плоской карте:

Mono.just(myVar)
    .flatMap(MyClass::heavyOperation)
    .flatMap(x -> Tuples.of(x, MyClass.anotherHeavyOperation(myVar))
    .flatMap(res -> doSomething(res.getT2(), res.getT1()));
2 голосов
/ 16 апреля 2019

Рассмотрим вопрос о сохранении объема:

Mono.just(myVar)
    .flatMap(var -> {
        Object myObj = MyClass.heavyOperation(var);                  
        return MyClass.anotherHeavyOperation(myObj)
            .flatMap(res -> doSomething(res, myObj));
    });
0 голосов
/ 16 апреля 2019

Вы можете сохранить Mono в переменной, а затем просто сжать его снова с Mono после anotherHeavyOperation.

var heavyOperation = Mono.just(myVar)
    .flatMap(MyClass::heavyOperation)
    .cache();

heavyOperation
   .flatMap(MyClass::anotherHeavyOperation)
   .zipWith(heavyOperation, (res, ho) -> doSomething(res, ho));
...