使用Option [List [Long]]时,将空列表替换为空列表

时间:2019-02-25 23:01:04

标签: scala

我有一些Seq[Strings]需要转换为Option[Seq[Long]]。我正在使用以下内容:

val idsAsLongsUDF: Seq[String] => Option[Seq[Long]] = {
  idsSeqStr: Seq[String] =>
  import scala.util.Try
  Try(idsSeqStr.flatMap(id => Try(id.toLong).toOption)).toOption match {
    case Some(List()) => None: Option[Seq[Long]]
    case x => x
  } 
}

要注意的是,一个空列表以Some(List())而不是None的形式返回-这是正确的,但不是所希望的。因此,最后几行通过在找到空列表时返回None来解决空列表问题。

我想获得此试验数据建议的Option[List[Long]]退货:

val s = Seq("abc", null)   // None
val n : Seq[String] = null // None
val l = Seq("a", "1", "2") // Some(List(1,2))

有没有比我写的更为优雅或有效的方法?

1 个答案:

答案 0 :(得分:4)

这只猫的皮肤可能有不止一种方法,而情人眼中的情人眼中却是优雅,但这是我的写法:

val idsAsLongsUDF: Seq[String] => Option[Seq[Long]] = { idsSeqStr =>
  import scala.util.Try
  Option(idsSeqStr)
    .map(_.flatMap(id => Try(id.toLong).toOption))
    .filterNot(_.isEmpty)
}