iTs*_*aMe 2 scala flatten flatmap
给定一个如下所示的复杂对象:
case class Complex
(
id: Long,
name: String,
nested: Seq[Complex]
)
Run Code Online (Sandbox Code Playgroud)
在实际操作中,这可能会变成这样:
val stuff =
List(
Complex(1, "name1",
List(
Complex(2, "name2", List()),
Complex(3, "name3",
List(
Complex(4, "name4", List())
)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
我需要将其变成一个平面Complex对象列表,将所有子/孙子拉起来。
val flattened =
List(
Complex(1, "name1", List()),
Complex(2, "name2", List()),
Complex(3, "name3", List()),
Complex(4, "name4", List()),
)
Run Code Online (Sandbox Code Playgroud)
您对我如何实现这一目标有任何线索/想法吗?
我尝试过的其他解决方案似乎只做简单的列表嵌套。我尝试过的事情:
这些似乎都产生了与我开始时相同的列表。
这里压平输入 Seq 的困难在于需要删除结果列表中的嵌套引用。这可以通过使用 = 空列表复制原始对象nested并展平所有序列来完成:
def flatten(obj: Complex): Seq[Complex] = {
val unnested = obj.copy(nested = List())
Seq(unnested) ++ obj.nested.flatMap(flatten)
}
println(stuff.flatMap(flatten))
List(
Complex(1,name1,List()),
Complex(2,name2,List()),
Complex(3,name3,List()),
Complex(4,name4,List())
)
Run Code Online (Sandbox Code Playgroud)