首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Kotlin协同器爬行递归结构?

如何使用Kotlin协同器爬行递归结构?
EN

Stack Overflow用户
提问于 2020-04-04 17:13:42
回答 1查看 707关注 0票数 1

给定一个类似树的结构,以及一个获取节点子节点的操作,例如:

代码语言:javascript
复制
typealias NodeReference = URL 

data class Node(
     val data:Data,
     val childrenList:List<NodeReference>)

suspend fun resolve(nodeRef:NodeReference) : Node    

您知道实现具有签名的爬虫功能的蓝图吗?

代码语言:javascript
复制
fun nodeList(rootNode:NodeReference) : List<Node> = 
    runBlocking(...) {
      ...
    }

使用Kotlin协同线返回树的所有节点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-04 19:58:42

要有效地解决这个问题,您应该:

rootNode: Node

  • Recursively

  • 解析rootRef: NodeReference以异步调用results

  • Merge的rootNode

  • Await的所有childrennodeList方法--结果,并向其添加

以下是您可以这样做的方法:

代码语言:javascript
复制
suspend fun nodesList(rootRef: NodeReference): List<Node> = coroutineScope {
    val rootNode = resolve(rootRef) // 1
    rootNode.childrenList
        .map { async { nodesList(it) } } // 2
        .awaitAll() // 3
        .flatten() + rootNode // 4
}

如果要使用当前线程执行nodesList,可以按以下方式执行:

代码语言:javascript
复制
fun nodesListBlocking(rootRef: NodeReference): List<Node> = runBlocking { nodesList(rootRef) }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61031827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档