【问题标题】:Idiomatic way of treating Option[Boolean]处理 Option[Boolean] 的惯用方式
【发布时间】:2013-06-15 07:40:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 由于您要将三元条件简化为双重条件,IMO 惯用的方法是生成一个普通布尔值 (getOrElse(false)) 并删除 Option
  • @0__ 选项对于我以后必须做的一些处理来说非常方便。
  • 你不能使用ob.isDefined 来获取底层的布尔值吗?
  • @JasonD 但是那会为Some(false)返回None吗?
  • 会的,我明白你的意思了。

标签: scala


【解决方案1】:

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

【讨论】:

  • 谢谢!我也找到了for(x <- ob if x) yield x
  • @Eduardo - 确实。还有ob.filterNot(! _)ob.find(identity)ob.collect{ case true => true } 和其他各种。你也可以写x=>x 代替identity
【解决方案2】:

我同意其他人的观点,您最好返回 truefalse,因为您没有区分属性根本不存在,是 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-05-21
  • 2011-11-22
  • 1970-01-01
  • 2021-11-24
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多