Spring boot 如何在springboot项目反应堆Mono流(用Kotlin编写)中放置条件检查?

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

我对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 == "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的返回类型)我的答案对您不起作用?你能检查一下吗?:)