我正在使用Scala案例声明如下:
users.collect {
case SomeClass(_, id, _, latestVersion, time)
if latestVersion.getOrElse("null") == someVariable || // etc. =>
// bunch of stuff here
}
latestVariable
是Option
,经常在if
内使用,并作为嵌套在其中的代码的一部分。
有没有办法在进入Option[String]
语句之前将"null"
最新版本转换为if
的普通字符串或内部值?我似乎无法让它发挥作用。
答案 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中,这可能被视为对Option
和Extractor
的虐待。
我认为更好的方法是为整个案例编写一个提取器,在
的某处。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}}。