Kotlin协程和Arrow库是避免嵌套flatmap的好方法,在Kotlin中引入了单子理解。然而,Kotlin的Flow
类型仍然依赖于声明式的flatmapping,因此我们会进入直接和声明式风格混合的情况:
override suspend fun findAll(page: Pageable): Either<BusinessException, Flow<PageElement<ClientOut>>> = either {
val count = clientRepository.count().awaitSingle().bind()
return clientRepository.findByIdNotNull(page).asFlow()
.flatMapMerge { client ->
flow { emit(mapDetailedClientOut(client)) }
}
}
val count
已经在 either {...}
推导式中绑定。然而,在使用 Flow
时似乎没有办法做到这一点,这迫使我们嵌套一个 flatmapMerge()
。
是否有方法可以实现这一点,或者计划在不久的将来某种方式包含它?
.bind()
)和声明性风格(Flow.flatmapMerge
)。像 Scala 的 ZIO 这样的库允许对等类型(ZStream)进行操作 https://zio.dev/next/datatypes/stream/zstream/。 - codependent