Kotlin 如何从外部非挂起函数构建序列

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协同

我有一个java方法
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,那么您可能有机会成功