Kotlin 只能在coroutine body error中调用暂停函数

Kotlin 只能在coroutine body error中调用暂停函数,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,所以,我对科特林的合作项目还相当陌生,我不明白这里发生了什么。我确实有一个从另一个调用的挂起函数 这里正确的语法是什么 suspend fun doSomething(str: Optional<String>) { // Error: Suspension functions can be called only within coroutine body str.map { doSomethingElse() } } suspend fun doSomethingEl

所以,我对科特林的合作项目还相当陌生,我不明白这里发生了什么。我确实有一个从另一个调用的挂起函数

这里正确的语法是什么

suspend fun doSomething(str: Optional<String>) {
  // Error: Suspension functions can be called only within coroutine body
  str.map { doSomethingElse() } 
}

suspend fun doSomethingElse() { }
suspend fun doSomething(str:可选){
//错误:只能在协同程序体中调用暂停函数
str.map{doSomethingElse()}
}
挂起fun doSomethingElse(){}
然而,这很好

suspend fun doSomething(str: Optional<String>) {
  if (str.isPresent) {
    doSomethingElse()
  }
}

suspend fun doSomethingElse() {}
suspend fun doSomething(str:可选){
如果(str.isPresent){
doSomethingElse()
}
}
挂起fun doSomethingElse(){}
可选。map()不是内联函数。传递的lambda是一个接口,因此如果您尝试从接口调用挂起函数,则不再从协程调用它


在这种情况下,您可以使用
.orElse(null)
可选的
转换为可为空的
字符串?
,然后在结果为非空时调用该函数
Optional
是Java的空安全解决方案,因为Java在语法/编译器级别不支持它。您不需要在Kotlin代码中使用它,除非它是从Java代码传递给您的。

这是否回答了您的问题@谢尔盖,我想OP知道这个问题是关于什么的。这里的困惑在于为什么您似乎无法从另一个挂起函数内部调用挂起函数。这是因为lambda不是
内联的