Kotlin 如何从外部非挂起函数构建序列
我有一个java方法Kotlin 如何从外部非挂起函数构建序列,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我有一个java方法visitchildren递归(Node root,NodeVisitor p),它允许我通过提供SAM访问者来迭代树状结构的元素 我想将这种方法转换为基于序列的迭代 然而,这个代码 buildSequence { visitChildrenRecursively(root, NodeVisitor { yield(it) }) } …编译失败,出现错误暂停函数只能在coroutine body中调用第行的yield(it) Kotlin协同
visitchildren递归(Node root,NodeVisitor p)
,它允许我通过提供SAM访问者来迭代树状结构的元素
我想将这种方法转换为基于序列的迭代
然而,这个代码
buildSequence {
visitChildrenRecursively(root, NodeVisitor {
yield(it)
})
}
…编译失败,出现错误暂停函数只能在coroutine body中调用第行的yield(it)
Kotlin协同程序建议将我的visitchildren递归地
转换为挂起函数,方法是将其包装在suspendCoroutine
块中
这是正确的方法吗?或者,如果不使用kotlinx
中的product
方法,这是否可能,如中所示
我还尝试了非正式描述中的“异步序列”部分,但没有成功。恐怕你是在问不可能的事情。Kotlin并不是通过一些后门JVM魔术来实现协同路由,而是通过转换常规Java方法来实现。可挂起函数涉及隐藏的方法签名更改及其返回类型更改。您的访问者可能有一个方法
void visit(Node)
这将不得不改变
Object visit(Node, Continuation)
即使我们假设这是可能的,您的下一个障碍将是visitchildrenrecursive()
,它不知道可挂起函数的特殊约定。它们要求呼叫者为正常呼叫传入其延续,为恢复呼叫传入其自己的延续。当挂起时,它们返回COROUTINE\u SUSPENDED
,如果调用方得到它,则必须返回相同的值
如果您可以复制粘贴visitchildrenrecursive()
的实现并将其迁移到Kotlin,那么您可能有机会成功