【问题标题】:how to concatenate option in scala如何在scala中连接选项
【发布时间】:2014-12-05 23:02:57
【问题描述】:

什么是 scala 中一种优雅/正确的方式来连接选项,以便 None 呈现为空字符串,并且具有值的变量不会被包裹在 Some("xyz") 中

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

我想要的输出例如

hello,

而不是

Some(hello),None

【问题讨论】:

    标签: scala


    【解决方案1】:

    一种方法是:

    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(",") 等等 res: String = Hello跨度>
    • 用户名加 1。
    【解决方案2】:

    要以安全的方式从Option 获取值,请使用getOrElse 并提供默认参数,以防OptionNone 时使用。在您的示例中,它看起来像这样:

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

    然后你会得到所需的结果

    【讨论】:

      【解决方案3】:

      首先:将Option[String] 转换为String

      opt.getOrElse("")
      

      或者如果您更喜欢类似运算符的方法调用语法:

      opt getOrElse ""
      

      那么getOrElse可以用Scalaz提供的|别名缩短:

      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
      

      ——注意单词之间总是只有一个空格,不像上面那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 2014-02-18
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多