我有一些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))
有没有比我写的更为优雅或有效的方法?
答案 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)
}