Spring boot 如何在springboot项目反应堆Mono流(用Kotlin编写)中放置条件检查?
我对ProjectReactor还很陌生,我正努力在我的Mono流中加入一个条件检查。我的应用程序的这一部分正在接收来自卡夫卡的对象。假设物体是这样的Spring boot 如何在springboot项目反应堆Mono流(用Kotlin编写)中放置条件检查?,spring-boot,kotlin,reactive-programming,project-reactor,reactor,Spring Boot,Kotlin,Reactive Programming,Project Reactor,Reactor,我对ProjectReactor还很陌生,我正努力在我的Mono流中加入一个条件检查。我的应用程序的这一部分正在接收来自卡夫卡的对象。假设物体是这样的 data class SomeEvent(val id: String, val type: String) fun process(someEvent: SomeEvent): Mono<String> { val id = someEvent.id val checkCondition = someEvent.type
data class SomeEvent(val id: String, val type: String)
fun process(someEvent: SomeEvent): Mono<String> {
val id = someEvent.id
val checkCondition = someEvent.type == "thisType"
return repoOne.getItem(id)
.map {item ->
// WHAT DO I DO HERE TO PUT A CONDITIONAL CHECK
createEntryForItem(item)
}
.flatMap {entry ->
apiService.sendEntry(entry)
}
.flatMap {
it.bodyToMono(String::class.java)
}
.flatMap {body ->
Mono.just(body)
}
}
我有一个函数,可以像这样处理这个对象
data class SomeEvent(val id: String, val type: String)
fun process(someEvent: SomeEvent): Mono<String> {
val id = someEvent.id
val checkCondition = someEvent.type == "thisType"
return repoOne.getItem(id)
.map {item ->
// WHAT DO I DO HERE TO PUT A CONDITIONAL CHECK
createEntryForItem(item)
}
.flatMap {entry ->
apiService.sendEntry(entry)
}
.flatMap {
it.bodyToMono(String::class.java)
}
.flatMap {body ->
Mono.just(body)
}
}
但是,显然,这不起作用,因为if语句中的表达式被强制转换为Any
我应该如何写它来实现我想要实现的目标
更新:我希望进行条件检查的位置。您应该在getItem()
之后使用flatMap()
,而不是map()
在映射{}
中,可以变换值。因为要调用getDetails()
(它返回一个反应类型而不是一个值),所以必须使用flatMap{}
。这就是为什么您需要通过调用else分支上的Mono.just(createEntryForItem(item))
将项目包装在Mono中。只需将其拆分为另一个函数即可。你的代码也会更干净
repoOne.getItem(id)
.map { createEntry(it, checkCondition) }.
.flatMap.....
private fun createEntry(item, checkCondition): Item {
return if (checkCondition) {
repoTwo.getDetails(id).map { createEntryForItem(item, it) }
} else {
createEntryForItem(item)
}
}
抱歉,我刚刚意识到我把有条件的部分放错了位置。我已经更新了问题。该条件子句没有给我自动强制转换到单元的警告,但是,以下flatMap
不再有效,因为apiService.sendEntry(entry)
需要entry:entry
。目前,它是Mono
。我该怎么做?另外,您是否能够解释为什么使用Mono.just(createEntryForItem(item))
使条件子句工作?您必须从flatMap
返回Mono
。不能只返回一个值。检查和的文档。map
适用于您,如果您想将项目转换为另一种类型,并且无需调用另一个响应函数即可完成。示例:getUser().map{user->user.name}
但是使用flatMap,您可以在您的链中包含其他响应调用:getUser().flatMap{user->downloadImage(user.imageUrl)}
但是您不能在一个调用中混合这两种类型。详细信息如何?我需要从repoTwo.getDetails(id)获取它,我将它更新为您的更新示例。在不知道类型的情况下很难更具体。对不起,哪种对象类型可以帮助您改进答案?没有任何对象类型可以真正添加到我的答案中,但只是为了使私有函数的返回类型显式(createEntryForItem的返回类型)我的答案对您不起作用?你能检查一下吗?:)