所以,我对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() {}
答案 0 :(得分:1)
Optional.map()
不是内联函数。传递的lambda是一个接口,因此,如果您尝试从该接口调用suspend函数,则不再从协程调用它。
在这种情况下,可以使用Optional<String>
将String?
转换为可为空的.orElse(null)
,如果结果为非null,则调用该函数。 Optional
是Java的null安全解决方案,因为Java在语法/编译器级别不支持它。除非它是通过Java代码传递给您的,否则您无需在Kotlin代码中使用它。