Kotlin 优雅的if-else语句
我有以下kotlin方法,它当前使用非反应性mongodb存储库spring数据,返回一个列表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
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将其合并。我明白了,我想根据键执行操作,但我明白你的意思,诚实地使用两个不同的流会更容易。