在Scala中工作时,我经常要解析[A]
类型的字段,并将其转换为Option[A]
,只有一个案例(例如"NA"
或{{1转换为""
,其他情况包含在其中。
现在,我正在使用以下匹配语法。
None
有没有更简洁/惯用的方式来写这个?
答案 0 :(得分:10)
有一种更简洁的方法。其中之一:
Option(x).filter(_ != "")
Option(x).filterNot(_ == "")
会做到这一点,虽然效率稍低,因为它会创建一个Option,然后可能会抛弃它。
如果你这么做很多,你可能想要创建一个扩展方法(或者只是一个方法,如果你不介意首先使用方法名称):
implicit class ToOptionWithDefault[A](private val underlying: A) extends AnyVal {
def optNot(not: A) = if (underlying == not) None else Some(underlying)
}
现在你可以
scala> 47.toString optNot ""
res1: Option[String] = Some(47)
(当然,你总是可以创建一个方法,它的主体是你的匹配解决方案,或者是一个与if相同的方法,所以你可以在特定情况下重复使用它。)
答案 1 :(得分:4)
我可能会在这里使用filterNot
:
scala> Option("hey").filterNot(_ == "NA")
res0: Option[String] = Some(hey)
scala> Option("NA").filterNot(_ == "NA")
res1: Option[String] = None
它要求您将Option
视为具有一个或零个元素的集合,但如果您养成这个习惯则相当清楚。
答案 2 :(得分:0)
一种简单直观的方法包括这个表达式,
if (s.isEmpty) None else Some(s)
这假设s
标记了要匹配的值(感谢@RexKerr注释)。