Правильный способ использования реактивного метода с if / else

#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());
        }
 

С уважением