繁体   English   中英

Scala Syntactic Sugar转换为`Option`

[英]Scala Syntactic Sugar for converting to `Option`

在Scala中工作时,我经常想要解析[A]类型的字段并将其转换为Option[A] ,将单个案例(例如, "NA""" )转换为None ,另一个案件被包裹在一些。

现在,我正在使用以下匹配语法。

match {
  case "" => None
  case s: String => Some(s)
}
// converts an empty String to None, and otherwise wraps it in a Some.

有没有更简洁/惯用的方式来写这个?

有一种更简洁的方法。 之一:

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相同的方法,所以你可以在特定情况下重用它。)

我可能在这里使用filterNot

scala> Option("hey").filterNot(_ == "NA")
res0: Option[String] = Some(hey)

scala> Option("NA").filterNot(_ == "NA")
res1: Option[String] = None

它要求您将Option视为具有一个或零个元素的集合,但如果您养成这个习惯则相当清楚。

一个简单直观的方法包括这个表达,

if (s.isEmpty) None else Some(s)

这假设s标记了另外匹配的值(感谢@RexKerr的注释)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM