Java 使用if/else的反应式方法的正确方法

Java 使用if/else的反应式方法的正确方法,java,project-reactor,reactor,Java,Project Reactor,Reactor,这段代码运行良好。它返回Flux。但我想知道它是否正确,因为if语句首先求值,而publisher在订阅发生时求值 我应该以与反应流不同的方式使用if/else语句吗 class Example { Flux<Cars> getCars(CarTypeEnum carTypeEnum) { if (carTypeEnum == CarTypeEnum.VOLVO) { return carRepository.getVolvoCars(

这段代码运行良好。它返回
Flux
。但我想知道它是否正确,因为if语句首先求值,而publisher在订阅发生时求值

我应该以与反应流不同的方式使用if/else语句吗

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

您的代码没有问题。很明显,在一个更大的项目中,有些事情可能是错的,但就目前而言,没有什么错


if语句的方法基本上是一个汽车流的工厂方法。根据枚举,它将返回不同类型汽车的流。只有在订阅后,流(由存储库提供)才会开始发布。

Hi@Timur您的代码没有问题,但这是反应式编程的必备代码,我们需要改变我们的思维方式。 ProjectReactor有一个包含许多有用操作的工具包。应测试操作员
.filter
.switchIfEmpty

此代码与使用以下说明时的代码相同:

Flux getCars(CarTypeEnum CarTypeEnum){
返回Flux.just(carTypeEnum).filter(类型->类型==carTypeEnum.VOLVO)
.switchIfEmpty(其他->carRepository.getAllCars())
.flatMap(volvo->carRepository.getVolvoCars());
}

关于

我相信这是一种个人偏好,关于您如何想象代码的增长和维护。例如,如果您的所有其他函数都使用If/else,但这是唯一一个不使用的函数,我会更改它。否则这是你的决定。@KevinCrum我是反应世界的新手。我还没开始学呢。这是一个例子,没有其他代码,我认为代码是好的,因为它是,没有发生在代码应该担心你。但是,如果您想更加安全,可以使用Flux.defer包装代码,这将使其变得懒惰。