如果您有Option
aOpt
并且您只对实际包含某些内容感兴趣,则可以执行以下操作:
aOpt match {
case Some(a) => foo(a) // do something
case None => // do nothing
}
当然应该缩短为:
aOpt.foreach(a => foo(a))
现在说我有两个Option
s aOpt
和bOpt
。只有当这些Option
的两个实际上包含一个对象时,我才会感兴趣。
所以我写了
(aOpt, bOpt) match {
case (Some(a), Some(b)) => foo(a, b) // Do something
case _ => // Do nothing
}
如何将此缩短为更少的线?或者我怎么能在没有警告的情况下至少省略无用的case _ =>
行?
答案 0 :(得分:5)
作为-理解强>
for{
a <- aOpt
b <- bOpt
} foo(a, b)
<强> scalaz 强>
运营商|@|
import scalaz._, Scalaz._
(aOpt |@| bOpt)(foo)
方法^
^(aOpt, bOpt)(foo)
运营商tuple
val abOpt = aOpt tuple bOpt // Option[(A, B)]
abOpt.foreach( case (a, b) => foo(a, b) ) // or
abOpt.foreach( (foo _) tupled _ )