這種常見的模式感覺有點冗長:簡化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 }
有些事情會像這個已經存在?或者這是矯枉過正?
這種常見的模式感覺有點冗長:簡化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 }
有些事情會像這個已經存在?或者這是矯枉過正?
您可以創建Option
第一,在隨條件進行過濾:
Option(result).filter(condition)
,或者如果condition
沒有相關result
Option(result).filter(_ => condition)
有趣!儘管我有點擔心(a)條件/結果的意外(對我)順序,以及(b)無論是否需要總是計算「結果」的趨勢。雖然沒有想到,但!謝謝! – Tim
可以使用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)
import scalaz._, Scalaz._
val r = (1 == 2) ? Some(f) | None
System.out.println("Res = " + r)
啊,這個三位一體的操作員。謝謝!但是我希望避免重複添加Some()和None。 – Tim
下面是另一種方法是非常簡單:
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)
愛的StackOverflow ...學會從以下所有的答案這麼多。 – Tim