13

在我的 Scala 程序中,我收到了一些 JSON。

其中一个字段是可选的布尔值。如果该字段丢失,或者它的值为 false,我想返回None. 如果它的值为真,我想返回Some(true)

因为这相当于转换Some(false)None,所以我定义了以下函数:

def boolmap(ob: Option[Boolean]) = if(ob == Some(false)) None else ob

它有效,但似乎不是很地道。还有什么更优雅的吗?

4

2 回答 2

22

这是ob.filter(identity). 我不确定这是否更清楚,但它更短。

于 2013-06-18T22:18:54.570 回答
6

我同意其他人的观点,即您最好返回true,或者false因为您没有区分根本不存在的属性,存在null或存在false

如果你刚回来Boolean,你可以这样做:

scala> Some(true) exists { _ == true }
res0: true

scala> Some(false) exists { _ == true }
res1: Boolean = false

scala> None exists { _ == true }
res2: Boolean = false

如果您坚持返回Option[Boolean]模式匹配会更惯用:

ob match { 
  case Some(true) => Some(true) 
  case _          => None 
}

您也可以使用collect,但在这种情况下,它看起来 IMO 很奇怪:

obj collect { case true => true }
于 2013-06-18T23:13:22.937 回答