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

Этот код работает нормально. Он все равно возвращает Flux<Cars>. Но я хочу знать, правильно ли это, потому что сначала оценивается оператор if, а издатель оценивает, когда произойдет подписка?

Должен ли я использовать оператор if/else отдельно от реактивного потока?

class Example {
    Flux<Cars> getCars(CarTypeEnum carTypeEnum) {
        if (carTypeEnum == CarTypeEnum.VOLVO) {
            return carRepository.getVolvoCars();
        }
        
        return carRepository.getAllCars();
    }
}

person Timur    schedule 23.12.2020    source источник
comment
Я считаю, что это личное предпочтение того, как вы представляете, как ваш код будет расти и поддерживаться. Если, например, все ваши другие функции используют if/else, но это единственная, которая этого не делает, я бы изменил ее. В противном случае это ваш выбор.   -  person Kevin Crum    schedule 23.12.2020
comment
@KevinCrum Я новичок в реактивном мире. Я начал изучать его не так давно. Это пример, другого кода нет   -  person Timur    schedule 24.12.2020
comment
Я думаю, что с кодом все в порядке, в нем не происходит ничего, что должно вас беспокоить. Однако, если вы хотите быть более безопасным, вы можете обернуть свой код с помощью Flux.defer, что сделает его ленивым.   -  person Martin Tarjányi    schedule 24.12.2020


Ответы (2)


В вашем коде нет ничего плохого. Очевидно, что в контексте более крупного проекта что-то может быть не так, но в нынешнем виде в этом нет ничего плохого.

Ваш метод с оператором if в основном является фабричным методом для потока автомобилей. В зависимости от перечисления он вернет поток автомобилей разных типов. Только по подписке поток (предоставленный репозиторием) начнет публиковаться.

person rewolf    schedule 29.12.2020

Привет @Timur, твой код в порядке, но это императивный код с реактивным программированием, нам нужно изменить то, как мы думаем. Реактор проекта имеет набор инструментов со многими полезными операциями. следует протестировать операторы .filter и .switchIfEmpty

Этот код тот же, используя эту инструкцию:

    Flux<Cars> getCars(CarTypeEnum carTypeEnum) {
        return Flux.just(carTypeEnum).filter(type -> type == CarTypeEnum.VOLVO )
                .switchIfEmpty(other -> carRepository.getAllCars())
                .flatMap(volvo -> carRepository.getVolvoCars());
        }

С Уважением

person Santiago Garcia Gil    schedule 13.01.2021