【问题标题】:Scala Syntactic Sugar for converting to `Option`用于转换为“选项”的 Scala 语法糖
【发布时间】:2015-03-26 14:56:21
【问题描述】:

在 Scala 中工作时,我经常想解析 [A] 类型的字段并将其转换为 Option[A],将单个大小写(例如,"NA" 或 "")转换为 @987654325 @,而其他情况被包裹在一些中。

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

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

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

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

    这假定s 标记了要以其他方式匹配的值(感谢@RexKerr 的注释)。

    【讨论】:

    • 这假设您有一个简单的名称 s 开头。情况并非总是如此。
    【解决方案2】:

    我可能会在这里使用filterNot:

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

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

    【讨论】:

      【解决方案3】:

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

      Option(x).filter(_ != "")
      Option(x).filterNot(_ == "")
      

      可以解决问题,尽管它的效率有点低,因为它会创建一个选项,然后可能会丢弃它。

      如果你经常这样做,你可能想创建一个扩展方法(或者只是一个方法,如果你不介意先有方法名的话):

      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 等效的方法,因此您可以在特定情况下重用它。)

      【讨论】:

        猜你喜欢
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        • 2016-11-14
        • 2014-08-10
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多