惯用法治疗方法[布尔]

Edu*_*rdo 11 scala

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

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

这相当于转换Some(false)None,我定义了以下功能:

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

它有效,但它似乎不是非常惯用.有什么更优雅的吗?

Rex*_*err 21

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

  • 谢谢!我也发现`for(x <-ob if x)yield x` (2认同)
  • @Eduardo - 确实如此。还有 `ob.filterNot(! _)`、`ob.find(identity)`、`ob.collect{ case true => true }` 以及其他各种方法。您还可以写“x=>x”来代替“identity”。 (2认同)

Mar*_*ina 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
Run Code Online (Sandbox Code Playgroud)

如果你坚持返回Option[Boolean]一个模式匹配将更加惯用:

ob match { 
  case Some(true) => Some(true) 
  case _          => None 
}
Run Code Online (Sandbox Code Playgroud)

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

obj collect { case true => true }
Run Code Online (Sandbox Code Playgroud)

  • 而不是"存在{_ == true}",写"存在(身份)"或"包含(真实)"更为明智.许多程序员都不赞同将bool与true进行比较[明确地与布尔常量进行比较是不好的,例如在Java中是否(b == false)](http://stackoverflow.com/questions/2661110/is-it-bad-到明确的 - 比较 - 对 - 布尔常数 - 例如,如果-b-假-I). (3认同)