scala中的一种优雅/正确的方式是串联连接一个Option,以便None呈现为一个空字符串,并且具有值的变量不会包含在Some(“xyz”)
中case class foo(bar: Option[String], bun: Option[String])
println(myFoo.bar+ "," + myFoo.bun)
我想要的输出是例如
hello,
而不是
Some(hello),None
答案 0 :(得分:10)
一种方法是:
val a = foo(Some("Hello"), None)
a.productIterator.collect{ case Some(s) => s }.mkString(",")
另一种方式是:
Seq(bar, bun).flatten.mkString(",")
这不符合你的要求,因为它最后没有打印逗号,但我仍然建议它,因为它可能会做你想要的。
答案 1 :(得分:6)
要以安全的方式从Option
获取值,请使用getOrElse
并提供默认参数,以便在Option
为None
时使用该参数。在您的示例中,它看起来像这样:
case class foo(bar: Option[String], bun: Option[String])
println(myFoo.bar.getOrElse("") + "," + myFoo.bun.getOrElse(""))
然后您将获得所需的结果
答案 2 :(得分:2)
首先:将Option[String]
转为String
:
opt.getOrElse("")
或者如果您更喜欢类似于运算符的方法调用语法:
opt getOrElse ""
然后可以使用Scalaz提供的getOrElse
别名缩短|
:
import scalaz._, Scalaz._
opt | ""
此外,您可以让Scalaz为您计算""
;这是有效的,这要归功于为String
定义的Monoid
实例,它将String
的空(或零)值定义为空字符串:
opt.orZero
总而言之:
scala> ("hello".some).orZero + " blabla " + ("world".some).orZero
res9: String = hello blabla world
scala> (none[String]).orZero + " blabla " + ("world".some).orZero
res10: String = " blabla world"
scala> ("hello".some).orZero + " blabla " + (none[String]).orZero
res11: String = "hello blabla "
(我在这里使用Scalaz none
和some
;对于香草Scala,您必须写None: Option[String]
和Some("hello"): Option[String
才能获得正确的类型)
然而 ...你可能想要避免那些无关的空白,所以在实践中你真的要使用某些东西;以上只是为了学习/探索:
scala> List("hello".some, Some("blabla"), "world".some).flatten.mkString(" ")
res0: String = hello blabla world
scala> List("hello".some, none[String], "world".some).flatten.mkString(" ")
res1: String = hello world
- 请注意,与上述不同,单词之间总是只有一个空格。