【问题标题】:Elegant way of doing if else statement with a Flux使用 Flux 执行 if else 语句的优雅方式
【发布时间】:2019-11-19 14:19:03
【问题描述】:

我有以下 kotlin 方法,该方法当前使用返回列表的非反应性 mongodb 存储库(spring 数据)。

  fun register(userRegistration: UserRegistration) {
    val existing = userRepository.findByTokenOrUserId(userRegistration.deviceToken, userRegistration.userId)
    var alreadyRegistered = false
    if (existing.isNotEmpty()) {
      existing.forEach {
        if (!isAlreadyRegistered(it, userRegistration)) {
          userRepository.delete(it)
        } else {
          alreadyRegistered = true
        }
      }
    }
    if (!alreadyRegistered) {
      val pnUser = PnUser(userRegistration.userId, userRegistration.deviceToken, userRegistration.region, userRegistration.locale, userRegistration.deviceType, userRegistration.osVersion, userRegistration.appVersion, userRegistration.timezone)
      userRepository.save(pnUser)
    }

  }

如果 userRepository.findByTokenOrUserId 将返回 PnUser 的 Flux 而不是 List,我如何以优雅的方式获得相同的行为?

谢谢

【问题讨论】:

  • 您可以考虑使用 kotlin 协程,它可以让您像编写命令式一样编写异步代码,并且它支持带有 await 扩展功能的项目反应器
  • @MartinTarjányi 协程在概念上不如响应式编程强大。
  • 最优雅的方法是拆分Flux 并为现有用户过滤一个,另一个为不存在的用户过滤。然后做任何你想做的逻辑,最后将它们合并在一起。

标签: kotlin spring-data-mongodb project-reactor


【解决方案1】:

正如@Markus 所指出的,最优雅的方法是使用Flux.groupBy 拆分Flux,然后为每个键执行逻辑。

查看this answer了解更多信息:

【讨论】:

  • 我什至不会选择groupBy,因为它仍然需要在丑陋的 if 条件下匹配您正在处理的键。我将使用热Flux 将其拆分,将其过滤到两个不同的流中以获取两个相反的谓词,然后使用merge 将其加入。
  • 我明白了,我正在考虑根据键执行操作,但我明白你的意思,老实说使用两个不同的流会更容易。
【解决方案2】:

这并不完全一样,但对我来说它会做:

fun registerUser(userRegistration: UserRegistration) {
userReactiveRepository.findByTokenOrUserId(userRegistration.userId, userRegistration.userId).map {
  if (!isAlreadyRegistered(it, userRegistration)) {
    userReactiveRepository.delete(it).map {
      val pnUser = PnUser(userRegistration.userId, userRegistration.deviceToken, userRegistration.region, userRegistration.locale, userRegistration.deviceType, userRegistration.osVersion, userRegistration.appVersion, userRegistration.timezone)
      userReactiveRepository.save(pnUser)
    }
  }
}

}

【讨论】:

    猜你喜欢
    • 2022-10-25
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2021-06-17
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多