映射特定类型集合选项的最佳Scala实践

映射特定类型集合选项的最佳Scala实践,scala,Scala,我遇到的具体案例。如何有效地处理特定类型集合的Scala选项 正如其中一个答案中提到的,使用集合选项并不是最优的,最好用空集合表示没有值。但是,这个签名是一个古怪的外部服务强迫我的 所以,举个例子。我有: val myData = Option[Seq[MyObj]] case class MyObj(name: String) 我想把我的数据映射到另一种类型,它是NewObj的Seq 将myData映射到不同对象的最佳实践是什么?我首先要说的是,您应该重新考虑是否需要一个集合选项。通常更倾

我遇到的具体案例。如何有效地处理特定类型集合的Scala选项

正如其中一个答案中提到的,使用集合选项并不是最优的,最好用空集合表示没有值。但是,这个签名是一个古怪的外部服务强迫我的

所以,举个例子。我有:

val myData = Option[Seq[MyObj]]

case class MyObj(name: String)
我想把我的数据映射到另一种类型,它是NewObj的Seq


将myData映射到不同对象的最佳实践是什么?

我首先要说的是,您应该重新考虑是否需要一个集合选项。通常更倾向于用空集合表示没有值

myData.map(list => list.map(myObj => doThing(myObj)))
// Option[Seq[NewThing]]
但是如果您确实需要该选项,那么您可以假设转换的类型为MyObj=>MyNewObj:


首先,我想说的是,你应该重新考虑是否需要一个收藏选项。通常更倾向于用空集合表示没有值

但是如果您确实需要该选项,那么您可以假设转换的类型为MyObj=>MyNewObj:

如果给出选项[Seq[Obj]],则我将使用空的sequeunce来设置该选项:

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))
}
如果给出选项[Seq[Obj]],则我将使用空的sequeunce来设置该选项:

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

我完全同意你的看法。但是,我被迫选择收藏:[古怪的外部服务]我完全同意你的看法。但是,我不得不选择收集:[古怪的外部服务]
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))
}