2013-06-18 10 views
9

私のScalaプログラムでは、JSONをいくつか受け取りました。慣用の治療法Option [Boolean]

フィールドの1つはオプションのブール値です。フィールドがない場合、または値がfalseの場合はNoneを返します。その値が真であれば、Some(true)を返したいと思います。

これはNoneSome(false)の変換に相当しているので、私は次の関数定義されている:それは作品

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

を、非常に慣用的ではないようです。よりエレガントなものはありますか?

+6

あなたは二重条件にトライアディック条件を減らしています。IMOイディオムはプレーンなブール値( 'getOrElse(false)')を生成し、 'Option'をドロップすることになります –

+0

@ 0__事はオプションを持っています後でする必要があります。 – Eduardo

+0

'ob.isDefined'を使用して基礎となるブール値を取得できませんか? –

答えて

19

ob.filter(identity)です。それが明確かどうかはわかりませんが、それはもっと短くなります。

+1

ありがとう!私はまたfor(x < - obならx)yield x 'を見つけました。 – Eduardo

+0

@Eduardo - 確かに。 'ob.filterNot(!_)'、 'ob.find(identity)'、 'ob.collect {case true => true}'、その他様々なものがあります。 'identity'の代わりに' x => x'を書くこともできます。 –

6

私はあなたがnullいるかfalseされ、全くそこにいるではない属性を区別していないので、あなたにもちょうどtrueまたはfalseを返すことがあります他の人と同意します。

あなたはちょうどあなたがそれをこのように行うことができますBoolean返された場合:あなたは、パターンマッチがより慣用的だろうOption[Boolean]を返すことを主張した場合

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

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

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

を:

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

またcollectを使用することができますが、この場合、それは奇妙なIMOに見えます:

obj collect { case true => true } 
+2

'exists {_ == true}'の代わりに 'exists(identity)'や 'contains(true)'を書く方が賢明です。 boolとtrueとを比較することは、多くのプログラマにとって嫌われています[ブール定数と明示的に比較することは悪いですか? if(b == false)in Java](http://stackoverflow.com/questions/2661110/is-it-bad-to-explicitly-compare-against-boolean-constants-eg-if-b-false-i )。 – Suma

関連する問題