首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin FlatMap & Recursion

Kotlin FlatMap & Recursion
EN

Stack Overflow用户
提问于 2018-06-21 14:33:39
回答 1查看 2.5K关注 0票数 1

我有一个数据结构,它是一棵树。每件物品都有孩子,他们也可能有孩子等等:

代码语言:javascript
运行
复制
class NavigationItem(
    val title: String,
    val parent: NavigationItem?
) {
    val children: MutableList<NavigationItem> = mutableListOf()
    val isLeaf: Boolean
        get() = children.count() == 0

    val allChildren: List<NavigationItem>
        get() = children.flatMap {
            it.allChildren
        }
}

我假设allChildren合成属性会遍历图形,映射到它的子属性-- allChildren属性--并贯穿整个过程。

这不是正在发生的事情:

代码语言:javascript
运行
复制
@Test
fun testAllChildrenProperty() {
    val root = NavigationItem("Root", null).apply {
        children.add(NavigationItem("Level 1", this))
        children.add(NavigationItem("Level 1", this))
    }
    assertEquals(2 ,root.allChildren.count())
}

这个单元测试失败--我们只是得到一个allChildren的空列表。有人能解释A) kotlin中的flatMap做什么,B)我应该使用什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-21 14:37:17

您对flatMap函数的理解似乎是正确的,使用递归看起来也不错。问题是,尽管您通过所有的子类进行递归,但实际上您从未将其中的任何一个添加到返回的列表中!

这个怎么样?

代码语言:javascript
运行
复制
val allChildren: List<NavigationItem>
    get() = children + children.flatMap { it.allChildren }

注意,包含了children +,它确保每个子元素本身都被添加到返回的列表中以及它的所有子列表中。

如果存在循环的可能性,则需要添加一些更复杂的逻辑。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50971124

复制
相关文章

相似问题

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