Kotlin FlatMap &&递归

时间:2018-06-21 14:33:40

标签: kotlin

我有一个数据结构,它是一棵树。每个项目都有孩子,并且可能有孩子等:

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属性映射到其子级并一直进行下去。

这不是正在发生的事情:

@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)我应该改用什么?

1 个答案:

答案 0 :(得分:2)

您对flatMap函数的理解似乎是正确的,并且您对递归的使用也很好。问题是,尽管您递归遍历所有子项,但是您实际上从未将它们中的任何一个真正添加到返回的列表中!

怎么样?

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

请注意包含children +,以确保每个子项及其所有子项都被添加到返回列表中。

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