【问题标题】:How to flatten a sequence within a case class如何在案例类中展平序列
【发布时间】:2019-11-26 13:44:46
【问题描述】:

在 Scala 中,是否可以更有效地使用平面图来处理包含要分解的数组的案例类?

这是一个有效的代码,但看起来不正确:

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))
    }
}

【问题讨论】:

  • 对于最后一行,你可以只写“stuffs.foreach(stuff => println(stuff))”而不是“stuffs.foreach(println)”。

标签: scala scala-collections flatten flatmap


【解决方案1】:

也许一个简单的理解会更具可读性:

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 在 cmets 中解释的那样,for comprehension 只是 mapflatMap 的糖语法。
因此,上面可以改写为:

someStuff.flatMap {
  case Stuff(name, stuffArray) =>
    stuffArray.map {
      stuff => FlatStuff(name, stuff)
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2018-07-13
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2016-01-25
  • 2017-03-29
相关资源
最近更新 更多