使用Scala中的选项

dan*_*rvt 2 scala

我有几个Option对象,比如a,b和c.如果它们不是None这样的话我想连接它们的值:

var str = "values: "
if (!a.isEmpty) str = str + a.get
if (!b.isEmpty) str = str + b.get
if (!c.isEmpty) str = str + c.get
Run Code Online (Sandbox Code Playgroud)

这是非常必要和javaish.有没有更好的方法来使用Scala并仍然保持代码可读?

谢谢!

ste*_*tew 5

这个问题需要一些强制性的scalaz答案:

导入scalaz:

scala> import scalaz._ ; import Scalaz._
import scalaz._
import Scalaz._
Run Code Online (Sandbox Code Playgroud)

创建一些可选值:

scala> val List(a,b,c,d) = List(Some("str1"), Some("str2"),None,Some("str3"))
a: Option[String] = Some(str1)
b: Option[String] = Some(str2)
c: Option[String] = None
d: Option[String] = Some(str3)
Run Code Online (Sandbox Code Playgroud)

scalaz为Option [A]创建一个一元〜运算符,其中A有一个monoid,这样~a a.getOrElse(Monoid[A].zero)与字符串monoid相同,零元素是一个空字符串("")

scala> "values: " + ~a + ~b + ~c + ~d
res0: String = values: str1str2str3
Run Code Online (Sandbox Code Playgroud)

|+|是monoid追加操作的语法,当A有一个monoid时,Option [A]有一个monoid,所以这个.这允许我们将Option[String]s 附加在一起以获得新的Option[String]

scala> "values: " +  (a |+| b |+| c |+| d).getOrElse("")
res1: String = values: str1str2str3
Run Code Online (Sandbox Code Playgroud)

结合两个运营商:

scala> "values: " +  ~(a |+| b |+| c |+| d)
res2: String = values: str1str2str3
Run Code Online (Sandbox Code Playgroud)