如何在scala中连接选项

如何在scala中连接选项,scala,Scala,在scala中,串接选项的优雅/正确方法是什么,这样就不会将任何一个呈现为空字符串,并且不会将具有值的变量包装在某些(“xyz”)中 我想要的输出是例如 hello, 而不是 Some(hello),None要以安全的方式从选项获取值,请使用getOrElse并提供默认参数,如果选项为无,则将使用该参数。在您的示例中,它将如下所示: case class foo(bar: Option[String], bun: Option[String]) println(myFoo.bar.getOrE

在scala中,串接选项的优雅/正确方法是什么,这样就不会将任何一个呈现为空字符串,并且不会将具有值的变量包装在某些(“xyz”)中

我想要的输出是例如

hello,
而不是


Some(hello),None
要以安全的方式从
选项
获取值,请使用
getOrElse
并提供默认参数,如果
选项
,则将使用该参数。在您的示例中,它将如下所示:

case class foo(bar: Option[String], bun: Option[String])
println(myFoo.bar.getOrElse("") + "," + myFoo.bun.getOrElse(""))
然后您将得到所需的结果,其中一种方法是:

val a = foo(Some("Hello"), None) 
a.productIterator.collect{ case Some(s) => s }.mkString(",")
Seq(bar, bun).flatten.mkString(",")
另一种方法是:

val a = foo(Some("Hello"), None) 
a.productIterator.collect{ case Some(s) => s }.mkString(",")
Seq(bar, bun).flatten.mkString(",")

这不符合您的要求,因为它不会在末尾打印逗号,但我仍然建议它,因为它可能会满足您的要求

首先:要将
选项[String]
转换为
字符串

opt.getOrElse("")
或者,如果您更喜欢类似于运算符的方法调用语法:

opt getOrElse ""
然后可以使用以下提供的
别名缩短
getOrElse

此外,您可以让计算机为您计算
;这是因为有一个为
String
定义的实例,它将
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

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

作为一个case类,我们可以迭代它的参数并收集“some”值;例如,val a=foo(some(“Hello”),None)我们有一个.productIterator.collect{case some=>s}.mkString(“,”),因此res:String=Helloplus 1作为用户名。