Попробуйте flatMap
или concatMap
с помощью оператора flatMap
вы можете сгладить подпоток в неблокирующей общедоступной
Flux<Object> test {
method1().flatMap(obj -> {
if (obj.getTotalItems() > 20) {
return method2(obj)
.map(result -> {
obj.setItems(result);
return obj;
});
}
return Mono.just(obj);
});
}
flatMap позволяет выравнивать несколько потоков одновременно, поэтому в случае длительных операций вы можете использовать более эффективные элементы процесса.
Одним недостатком flatMap является то, что он не сохраняет порядок элементов, поэтому если у вас есть последовательность вышестоящих элементов, таких как [1, 2, 3, 4]
с flatMap
, есть вероятность, что порядок будет изменен из-за асинхронного характера подпотоков .
Чтобы сохранить порядок, вы можете использовать concatMap
, который выравнивает только один поток за раз, поэтому есть гарантии, что порядок элементов выравнивания будет сохранен:
Flux<Object> test {
method1().concatMap(obj -> {
if (obj.getTotalItems() > 20) {
return method2(obj)
.map(result -> {
obj.setItems(result);
return obj;
});
}
return Mono.just(obj);
});
}
Примечание
Мутация объектов таким способом - не лучшая идея, и я бы предпочел использовать неизменный объект объект-образец в реактивном программировании