如何展平案例中的序列 class
How to flatten a sequence within a case class
在 Scala 中,是否可以更有效地使用包含要展开的数组的 case 类 的平面图?
这是一个有效但看起来不正确的代码:
object stuff {
def main(args: Array[String]): Unit = {
case class Stuff(name: String, stuff: Seq[String])
case class FlatStuff(name: String, stuff: String)
val someStuff = Array(Stuff("a", Seq("1", "2", "3")), Stuff("b", Seq("4", "5")))
val stuffs = someStuff.flatMap(item => {
val flatten = new Array[FlatStuff](item.stuff.length)
for (i <- 0 until item.stuff.length) {
flatten(i) = FlatStuff(item.name, item.stuff(i))
}
flatten
})
stuffs.foreach(stuff => println(stuff))
}
}
也许一个简单的理解会更易读:
val stuffs = for {
Stuff(name, stuffArray) <- someStuff // for each name & struffArray in someStuff.
stuff <- stuffArray // for each stuff in stuffArray.
} yield FlatStuff(name, stuff) // Return a new FlatSutff.
正如@user6337 在评论中解释的那样, 理解 只是 map
& flatMap
.
的语法糖
因此,上面可以重写为:
someStuff.flatMap {
case Stuff(name, stuffArray) =>
stuffArray.map {
stuff => FlatStuff(name, stuff)
}
}
在 Scala 中,是否可以更有效地使用包含要展开的数组的 case 类 的平面图?
这是一个有效但看起来不正确的代码:
object stuff {
def main(args: Array[String]): Unit = {
case class Stuff(name: String, stuff: Seq[String])
case class FlatStuff(name: String, stuff: String)
val someStuff = Array(Stuff("a", Seq("1", "2", "3")), Stuff("b", Seq("4", "5")))
val stuffs = someStuff.flatMap(item => {
val flatten = new Array[FlatStuff](item.stuff.length)
for (i <- 0 until item.stuff.length) {
flatten(i) = FlatStuff(item.name, item.stuff(i))
}
flatten
})
stuffs.foreach(stuff => println(stuff))
}
}
也许一个简单的理解会更易读:
val stuffs = for {
Stuff(name, stuffArray) <- someStuff // for each name & struffArray in someStuff.
stuff <- stuffArray // for each stuff in stuffArray.
} yield FlatStuff(name, stuff) // Return a new FlatSutff.
正如@user6337 在评论中解释的那样, 理解 只是 map
& flatMap
.
的语法糖
因此,上面可以重写为:
someStuff.flatMap {
case Stuff(name, stuffArray) =>
stuffArray.map {
stuff => FlatStuff(name, stuff)
}
}