你能把这个反应式方法转换成Arrow Fx Project Reactor monad comprehension吗?
class ApplicationServiceImpl(private val applicationRepository: ApplicationRepository,
private val clientRepository: ClientRepository) : ApplicationService {
override fun findByProjectId(clientId: String, projectId: String): Flux<ApplicationOut> {
return clientRepository.findById(clientId)
.switchIfEmpty(ClientDoesntExistException(clientId).toMono())
.flatMapMany { client ->
applicationRepository.findByProjectIdOrderByNameAsc(projectId).map {
it.convertToApplicationOut(client.timeZone)
}
}
}
}
我已经尝试过这样的事情,但它无效。
我发现的第一个问题是,最初我使用 flatMapMany 将 Mono 转换为 Flux。如果我使用FluxK.monad().fx.monad
clientRepository.findById(clientId).k().bind()
没有.bind()
可用的功能。
如果我MonoK.monad().fx.monad
改用我不知道如何将输出转换为通量:
override fun findByProjectId(clientId: String, projectId: String): Flux<out ApplicationOut> {
return FluxK.monad().fx.monad {
val client = clientRepository.findById(clientId).k().bind()
if (client != null) {
!applicationRepository.findByProjectIdOrderByNameAsc(projectId)
.map { it.convertToApplicationOut(client.timeZone) }.k()
} else {
throw !ClientDoesntExistException(clientId).toMono<ApplicationOut>().k()
}
}.fix().flux
更新
按照 El Paco 的回答,我将代码修改为:
return FluxK.monad().fx.monad {
val client = !clientRepository.findById(clientId).toFlux().k()
if (client != null) {
!applicationRepository.findByProjectIdOrderByNameAsc(projectId)
.map { it.convertToApplicationOut(client.timeZone) }.k()
} else {
!ClientDoesntExistException(clientId).toFlux<ApplicationOut>().k()
}
}.fix().flux
它clientRepository.findById(clientId)
存在时工作正常。如果没有,它不会将 null 分配给 val 客户端,而是退出理解(否则不执行),因此我无法从理解内启动我的异常,我想这是正常的。
考虑以下方法,其中我需要控制客户端或项目不存在的两种情况:
return clientRepository.findById(clientId)
.switchIfEmpty(ClientDoesntExistException(clientId).toMono())
.flatMapMany { client ->
applicationRepository.findByProjectIdOrderByNameAsc(projectId)
.switchIfEmpty(ClientDoesntExistException(projectId).toMono())
.map { it.convertToApplicationOut(client.timeZone) }
}
考虑到 if/else 方法不起作用,我如何在使用推导时处理那些不存在的情况?
我可以在理解之外使用 switchIfEmpty 运算符,但我不知道原因(客户端不存在 vs 项目不存在)
return FluxK.monad().fx.monad {
val client = !clientRepository.findById(clientId).toFlux().k()
!applicationRepository.findByProjectIdOrderByNameAsc(projectId)
.map { it.convertToApplicationOut(client.timeZone) }.k()
}.fix().flux
.switchIfEmpty(XXX)