如果守卫,则转换Scala案例变量

时间:2018-05-03 18:09:57

标签: scala

我正在使用Scala案例声明如下:

users.collect {
   case SomeClass(_, id, _, latestVersion, time) 
      if latestVersion.getOrElse("null") == someVariable || // etc. => 
         // bunch of stuff here
}

latestVariableOption,经常在if内使用,并作为嵌套在其中的代码的一部分。

有没有办法在进入Option[String]语句之前将"null"最新版本转换为if的普通字符串或内部值?我似乎无法让它发挥作用。

2 个答案:

答案 0 :(得分:1)

None作为"null"字符串的插入看起来有点令人不安。但是否则我通常会为这种情况编写一个提取器。

object VersionExtractor {
  /** I know it looks kinda funny but it does exactly what the op asked for. */
  def unnaply(in: Option[String]): Option[String] = in orElse Some("null")
}  

您可以像

一样使用它
case SomeClass(_, id, _, VersionExtractor(latestVersion), time) ...

其中latestVersion现在是String"null"或原始Option的内容。

然而,在Scala,imho中,这可能被视为对OptionExtractor的虐待。

我认为更好的方法是为整个案例编写一个提取器,在

的某处。
object MyExtractor {
  def unapply(input: SomeClass): Option[(<type of id>, String, <type of time>)] = {
    input.latestVersion match {
        // And now partially in pseudo code:
      case Some(version) /* if (input matches some criteria) */ => 
        Some((input.id, version, input.time))
      case _ => 
        None
    }
  }
}

如果操作正确,那么您的收藏应该如下:

users.collect {
   case MyExtractor(id, latestVersion /*: String */, time) => 
         // bunch of stuff here
}

答案 1 :(得分:0)

您可以通过在case语句中使用模式匹配来更轻松地进行所需的测试,如下所示:

Option

这测试someVariable是否存在且其值等于{{1}}。