2

当您有一个Option aOpt并且您只对实际包含某些内容时才对做某事感兴趣时,您可以执行以下操作:

aOpt match {
   case Some(a) => foo(a)  // do something
   case None => // do nothing
}

当然应该缩短为:

aOpt.foreach(a => foo(a))

现在说我有两个OptionsaOptbOpt. 只有当这两个sOption实际上都包含一个对象时,我才有兴趣做某事。

所以我写

(aOpt, bOpt) match {
   case (Some(a), Some(b)) => foo(a, b) // Do something
   case _ => // Do nothing
}

如何将其缩短为更少的行?或者我怎样才能至少在case _ =>没有警告的情况下省略无用的行?

4

1 回答 1

5

理解

for{
  a <- aOpt
  b <- bOpt
} foo(a, b)

斯卡拉兹

操作员|@|

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 _ )
于 2013-07-05T11:47:02.650 回答