我有几个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还有更好的方法吗? 保持代码可读?
谢谢!
答案 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(",")