【问题标题】:Correct way to use reactive method with if/else使用 if/else 反应式方法的正确方法
【发布时间】:2020-12-23 19:08:20
【问题描述】:

此代码运行良好。无论如何它都会返回Flux<Cars>。但我会知道它是否正确,因为 if 语句首先评估,但发布者评估订阅何时发生?

我应该将 if/else 语句与反应流分开使用吗?

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

【问题讨论】:

  • 我相信这是你个人对如何想象你的代码如何增长和维护的偏好。例如,如果您的所有其他功能都使用 if/else 但这是唯一不使用的功能,我会更改它。否则,这是你的电话。
  • @KevinCrum 我是反应式世界的新手。到目前为止,我已经开始学习它。这是一个例子,没有其他代码
  • 我认为代码本身就很好,代码中没有发生任何让你担心的事情。但是,如果您想更加安全,可以使用 Flux.defer 包装您的代码,这会使其变得懒惰。

标签: java project-reactor reactor


【解决方案1】:

您的代码没有任何问题。显然,在一个更大的项目的背景下,可能会出现问题,但就目前而言,并没有什么问题。

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

【讨论】:

    【解决方案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());
            }
    

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多