使用Scala中的选项

时间:2014-08-11 14:29:15

标签: 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

这是非常迫切的和javaish。使用Scala还有更好的方法吗? 保持代码可读?

谢谢!

5 个答案:

答案 0 :(得分:5)

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

导入scalaz:

scala> import scalaz._ ; import Scalaz._
import scalaz._
import Scalaz._

创建一些可选值:

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)

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

""

scala> "values: " + ~a + ~b + ~c + ~d res0: String = values: str1str2str3 是monoid追加操作的语法,当A有一个monoid时,Option [A]有一个monoid,所以这个。这允许我们将|+|附加在一起以获得新的Option[String]

Option[String]

合并两个运营商:

scala> "values: " +  (a |+| b |+| c |+| d).getOrElse("")
res1: String = values: str1str2str3

答案 1 :(得分:4)

将选项放入集合(列表)可以对所有元素(选项)执行操作,在这种情况下,flatten使作业从Options中取值,mkString正在合并字符串列表。

List(Some("str1"), Some("str2"),None,Some("str3")).flatten.mkString

答案 2 :(得分:1)

在Scala中可能有99种方法可以做到这一点。给定xs是选项列表, 选你的毒药。

 "Values:  " + (for{Some(s) <- xs} yield s).mkString

   xs.foldLeft("Values: ")( _ + _.getOrElse(""))

更不用说flatten和flatMap

答案 3 :(得分:0)

var str = "values: " + a.getOrElse("") + b.getOrElse("") + c.getOrElse("")

如果这看起来不够实用:

var str = "values: " + List(a, b, c).map {_.getOrElse("")}.mkString

答案 4 :(得分:-2)

val str = List(a, b,c).flatten.mkString(",")