我有一个数据结构,它是一棵树。每件物品都有孩子,他们也可能有孩子等等:
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)我应该使用什么?
发布于 2018-06-21 14:37:17
您对flatMap
函数的理解似乎是正确的,使用递归看起来也不错。问题是,尽管您通过所有的子类进行递归,但实际上您从未将其中的任何一个添加到返回的列表中!
这个怎么样?
val allChildren: List<NavigationItem>
get() = children + children.flatMap { it.allChildren }
注意,包含了children +
,它确保每个子元素本身都被添加到返回的列表中以及它的所有子列表中。
如果存在循环的可能性,则需要添加一些更复杂的逻辑。
https://stackoverflow.com/questions/50971124
复制相似问题