简洁地同时匹配多个选项

时间:2013-07-05 11:41:52

标签: scala pattern-matching

如果您有Option aOpt并且您只对实际包含某些内容感兴趣,则可以执行以下操作:

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

当然应该缩短为:

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

现在说我有两个Option s aOptbOpt。只有当这些Option两个实际上包含一个对象时,我才会感兴趣。

所以我写了

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

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

1 个答案:

答案 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 _ )