首页 > 解决方案 > 使用 Option[List[Long]] 时用 None 替换空列表

问题描述

我有一些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))

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

标签: scala

解决方案


给这只猫剥皮的方法可能不止一种,优雅在旁观者的眼中,但我会这样写:

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

推荐阅读