2013-07-05 34 views
2

匹配几个选项当你有一个OptionaOpt你只是一直在做的事情,如果它实际上包含的东西有兴趣,你可以做到以下几点:简洁地同时

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

这当然应该是缩短为:

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

现在说我有两个Option小号aOptbOpt。我只对这两个这些Option s实际上包含一个对象感兴趣。

所以我写

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

我怎样才能缩短这个较少的线路?或者我怎么能至少省略无用的case _ =>行而没有警告?

+1

http://www.scala-lang.org/api/current/index.html#scala.Option –

回答

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 _) 
+0

或第三scalaz方式:^( aOpt,bOpt)(foo) – 4lex1v

+0

@AlexIv,谢谢。随时编辑我的答案,当你认为它会有用。 – senia

+0

感谢您的全面清单。理解看起来像是我最好的选择。 – DCKing