2012-10-04 56 views
21

這種常見的模式感覺有點冗長:簡化if(x)Some(y)else None?

if (condition) 
    Some(result) 
else None 

我想用一個函數來簡化:

def on[A](cond: Boolean)(f: => A) = if (cond) Some(f) else None 

這降低了上方的例子:

on (condition) { result } 

有些事情會像這個已經存在?或者這是矯枉過正?

+2

愛的StackOverflow ...學會從以下所有的答案這麼多。 – Tim

回答

15

Scalaz包括option功能:

import scalaz.syntax.std.boolean._ 

true.option("foo") // Some("foo") 
false.option("bar") // None 
+0

我關心自己的功能的一件事是,它沒有明確表明正在創建一個選項。這既簡單又克服了這個問題。謝謝! – Tim

18

您可以創建Option第一,在隨條件進行過濾:

Option(result).filter(condition) 

,或者如果condition沒有相關result

Option(result).filter(_ => condition) 
+4

有趣!儘管我有點擔心(a)條件/結果的意外(對我)順序,以及(b)無論是否需要總是計算「結果」的趨勢。雖然沒有想到,但!謝謝! – Tim

3

可以使用PartialFunction同伴對象和condOpt

PartialFunction.condOpt(condition) {case true => result} 

用法:

scala> PartialFunction.condOpt(false) {case true => 42} 
res0: Option[Int] = None 

scala> PartialFunction.condOpt(true) {case true => 42} 
res1: Option[Int] = Some(42) 
+0

這全是42的意思嗎? 「真正」?本來可以避免建造地球...... ;-)以前沒見過'condOpt',謝謝! – Tim

+0

這絕對不是使用它最有用的場景,但它在許多其他情況下可能會有所幫助。 – Nicolas

+0

同意!很酷。 – Tim

1
import scalaz._, Scalaz._ 
val r = (1 == 2) ? Some(f) | None 
System.out.println("Res = " + r) 
+0

啊,這個三位一體的操作員。謝謝!但是我希望避免重複添加Some()和None。 – Tim

1

下面是另一種方法是非常簡單:

Option(condition).collect{ case true => result } 

一個簡單的例子:

scala> val enable = true 
enable: Boolean = true 

scala> Option(enable).collect{case true => "Yeah"} 
res0: Option[String] = Some(Yeah) 

scala> Option(!enable).collect{case true => "Yeah"} 
res1: Option[String] = None 

這裏說把條件轉換模式匹配一​​些先進的非布爾例子:

val param = "beta" 
Option(param).collect{case "alpha" => "first"} // gives None 

Option(param).collect{case "alpha" => "first" 
         case "beta" => "second" 
         case "gamma" => "third"} // gives Some(second) 

val number = 999 
Option(number).collect{case 0 => "zero" 
         case x if x > 10 => "too high"} // gives Some(too high)