Синтаксис для хранения результатов предыдущего отображения
Я хотел бы знать хороший способ использовать результаты предыдущего картирования в весеннем веб-потоке, например
Mono.just(request)
...
.flatMap(object0 -> createObject1(object0))
.flatMap(object1 -> createObject2(object1))
...
какой хороший способ получить object0 в этот момент, чтобы мы могли добавить что-то вроде
.flatmap(object0 -> createResult(object0))
Я решил это, объединив оба метода так, чтобы мы имели объект 0 в глобальной переменной, но это выглядит не очень хорошо.
Другой пример
Mono.just(request)
...
.flatMap(object0 -> createResponse(object))
.map(result -> mapToObject1(result))
.flatMap(object1-> saveObject1(object1))
Как вернуть "результат" на данный момент?
Не могли бы вы дать ссылку на хороший пример того же случая, потому что решение объединить эту строку, чтобы получить глобальный результат, не выглядит хорошим, так как создает неоднозначные методы?
4 ответа
Вы можете обернуть несколько объектов в reactor.util.function.Tuples
, как это:
Mono.just(request)
...
.flatMap(object0 -> Tuples.of(object0, createObject1(object0)))
.flatMap(tuple -> createObject2(tuple.getT2()))
...
Я не знаю, является ли это действительно лучшей практикой, потому что ваш фрагмент кода является очень общим, и я не могу сказать, является ли это проблемой с базовым API.
Для первого случая, потому что вы используете flatMap
за createObject1(object0)
Я предполагаю, что это возвращается Mono<Object1>
Я думаю, что следующий фрагмент кода может сделать то, что вы хотели.
public Mono<Class1> createObject1(Class0 object0) {
//...
}
public Mono<Class2> createObject2(Class1 object1, Class0 object0) {
//...
}
public void test() {
Mono.just(new Class0())
.flatMap(object0 -> createObject1(object0).zipWith(Mono.just(object0)))
.flatMap(tuple -> createObject2(tuple.getT1(), tuple.getT2()));
}
Во втором случае, как предполагает принятый ответ, используется reactor.util.function.Tuples
в map
Сделаю.
Вы можете использовать прямо на моно.
zipWhen
— это специальный оператор, объединяющий результаты.
Mono.just(request)
...
.zipWhen(object0 -> createObject1(object0))
...
Моя версия выглядит так
.flatMap(upperResult -> {
return Mono.just(upperResult).zipWith(monoGeneratingFunction(upperResult));
})
.flatMap(tuple -> {
var upperResult = tuple.getT1();
var lowerResult = tuple.getT2();
})