#java #project-reactor #reactor
#java #проект-реактор #реактор
Вопрос:
Этот код работает нормально. Он Flux<Cars>
все равно возвращается. Но я хочу знать, правильно ли это, потому что сначала оценивается оператор if, но издатель оценивает, когда произойдет подписка?
Должен ли я использовать оператор if / else отдельно от реактивного потока?
class Example {
Flux<Cars> getCars(CarTypeEnum carTypeEnum) {
if (carTypeEnum == CarTypeEnum.VOLVO) {
return carRepository.getVolvoCars();
}
return carRepository.getAllCars();
}
}
Комментарии:
1. Я считаю, что это личное предпочтение в отношении того, как вы представляете, что ваш код будет расти и поддерживаться. Если, например, все ваши другие функции используют if /else, но это единственная функция, которая этого не делает, я бы изменил ее. В противном случае это ваш вызов.
2. @KevinCrum Я новичок в реактивном мире. Я начал изучать его не так далеко. Это пример, и другого кода нет
3. Я думаю, что код и так хорош, в этом коде ничего не происходит, что должно вас беспокоить. Однако, если вы хотите быть в большей безопасности, вы можете обернуть свой код с помощью Flux.defer, что сделает его ленивым.
Ответ №1:
В вашем коде нет ничего плохого. Очевидно, что в контексте более крупного проекта что-то может быть не так, но в его нынешнем виде нет ничего плохого.
Ваш метод с инструкцией if — это, по сути, фабричный метод для потока автомобилей. В зависимости от перечисления он вернет поток разных типов автомобилей. Только при подписке поток (предоставляемый репозиторием) начнет публиковаться.
Ответ №2:
Привет @Timur, твой код в порядке, но это обязательный код с реактивным программированием, нам нужно изменить способ мышления. У Project reactor есть инструментарий со многими полезными операциями. следует ли тестировать операторы .filter
и .switchIfEmpty
Этот код такой же, используя эти инструкции:
Flux<Cars> getCars(CarTypeEnum carTypeEnum) {
return Flux.just(carTypeEnum).filter(type -> type == CarTypeEnum.VOLVO )
.switchIfEmpty(other -> carRepository.getAllCars())
.flatMap(volvo -> carRepository.getVolvoCars());
}
С уважением