最佳Scala练习,以映射特定类型的集合选项

时间:2017-03-20 14:52:52

标签: scala

我遇到的具体情况。如何有效处理特定类型集合的Scala选项?

正如其中一个答案中所提到的,使用Collection的Option并不是最优的,最好用空集合来表示缺少值。但是,这个签名是古怪的外部服务的力量。

所以,举个例子。我有:

val myData = Option[Seq[MyObj]]

case class MyObj(name: String)

我想将myData映射到NewObj的Seq的其他类型。

val newData: Seq[NewObj] = myData.XXX

myData映射到不同对象的最佳做法是什么?

3 个答案:

答案 0 :(得分:3)

我首先要说你应该重新考虑一个Option集合的需要。通常优选的是简单地用空集合表示缺少值。

但如果你真的需要Option,那么假设transform类型为(MyObj) => MyNewObj,你可以这样做:

val nyNewData: Option[Seq[MyNewObj]] = myData.map(_.map(transform))

答案 1 :(得分:2)

如果给出Option[Seq[Obj]],我getOrElse选项会出现空的后续行为:

object NewTest {
  case class MyObj(name: String)
  case class OtherObj(name: String, hash: Int)

  def main(args: Array[String]): Unit = {
    val myData: Option[Seq[MyObj]] = Some(Seq(MyObj("a")))
    val transformed: Seq[OtherObj] = 
      myData
        .getOrElse(Seq.empty[MyObj])
        .map(obj => OtherObj(obj.name, obj.name.hashCode))
}

答案 2 :(得分:0)

myData.map(list => list.map(myObj => doThing(myObj)))
// Option[Seq[NewThing]]