只能在协程体错误内调用悬架函数

时间:2020-07-28 22:27:33

标签: kotlin kotlin-coroutines

所以,我对Kotlin的协程还很陌生,我不明白这里发生了什么。我确实有一个从另一个函数调用的暂停函数。

这里正确的语法是什么?

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: Optional<String>) {
  if (str.isPresent) {
    doSomethingElse()
  }
}

suspend fun doSomethingElse() {}

1 个答案:

答案 0 :(得分:1)

Optional.map()不是内联函数。传递的lambda是一个接口,因此,如果您尝试从该接口调用suspend函数,则不再从协程调用它。

在这种情况下,可以使用Optional<String>String?转换为可为空的.orElse(null),如果结果为非null,则调用该函数。 Optional是Java的null安全解决方案,因为Java在语法/编译器级别不支持它。除非它是通过Java代码传递给您的,否则您无需在Kotlin代码中使用它。