Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 优雅的if-else语句_Kotlin_Spring Data Mongodb_Project Reactor - Fatal编程技术网

Kotlin 优雅的if-else语句

Kotlin 优雅的if-else语句,kotlin,spring-data-mongodb,project-reactor,Kotlin,Spring Data Mongodb,Project Reactor,我有以下kotlin方法,它当前使用非反应性mongodb存储库spring数据,返回一个列表 fun register(userRegistration: UserRegistration) { val existing = userRepository.findByTokenOrUserId(userRegistration.deviceToken, userRegistration.userId) var alreadyRegistered = false if

我有以下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流量而不是列表,那么如何以优雅的方式实现相同的行为


谢谢

这不完全一样,但对我来说可以:

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)
    }
  }
}

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


查阅更多信息:

您可以考虑使用KOTLIN协同程序,它可以让您编写异步代码,就像您编写命令一样,它支持等待扩展的项目反应堆。function@MartinTarjányi协程在概念上不如反应式编程强大。最优雅的方法是将流量和过滤器分开一个用于现有用户,另一个用于不存在的用户。然后做你想做的任何逻辑,并最终将它们合并在一起。我甚至不会选择groupBy,因为它仍然需要匹配你在丑陋的if条件下处理的键。我会使用热通量将其拆分,在两个不同的流中过滤两个相反的谓词,然后使用merge将其合并。我明白了,我想根据键执行操作,但我明白你的意思,诚实地使用两个不同的流会更容易。