我有一个数据结构,它是一棵树。每个项目都有孩子,并且可能有孩子等:
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)我应该改用什么?
答案 0 :(得分:2)
您对flatMap
函数的理解似乎是正确的,并且您对递归的使用也很好。问题是,尽管您递归遍历所有子项,但是您实际上从未将它们中的任何一个真正添加到返回的列表中!
怎么样?
val allChildren: List<NavigationItem>
get() = children + children.flatMap { it.allChildren }
请注意包含children +
,以确保每个子项及其所有子项都被添加到返回列表中。
如果存在循环的可能性,则需要添加一些更复杂的逻辑。