如何在scala中连接选项

时间:2014-12-05 23:02:58

标签: scala

scala中的一种优雅/正确的方式是串联连接一个Option,以便None呈现为一个空字符串,并且具有值的变量不会包含在Some(“xyz”)

case class foo(bar: Option[String], bun: Option[String])
println(myFoo.bar+ "," + myFoo.bun)

我想要的输出是例如

hello,

而不是

Some(hello),None

3 个答案:

答案 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并提供默认参数,以便在OptionNone时使用该参数。在您的示例中,它看起来像这样:

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 nonesome;对于香草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

- 请注意,与上述不同,单词之间总是只有一个空格。