Scala:如何将一些转换为实际

时间:2018-08-15 04:18:42

标签: scala

我是Scala的新手,我试图以制表符分隔的格式获取“ Lr”类型的所有属性值。但是,每当我在下面执行“ Echo”时,程序都将返回:

Some(something1)    Some(something2)

我希望:

something1  something2

关于如何修改代码以获取期望格式的任何线索吗?

package com.......

case class Lr (
             some1_ID : Option[String],
             some2_ID : Option[String]
          )
{
   def getData(): String =
   {
      return productIterator.mkString("\t")
   }
}

object Echo {
   def main( args:Array[String] ):Unit =
   {
      val testLR = Lr(Option("something1"),Option("something2"))
      print(testLR.getData())
   }
}

2 个答案:

答案 0 :(得分:6)

这取决于您要在某些属性为“无”的情况下要做什么。

如果您要放弃“无”

case class Lr (some1_ID : Option[String], some2_ID : Option[String]) {
 def getData: String = {
   Seq(some1_ID, some2_ID).flatten.mkString("\t")       
 }
}

如果要使用其他值

case class Lr(some1_ID : Option[String], some2_ID : Option[String]) {
  def getData: String = {
    Seq(some1_ID, some2_ID).map(_.getOrElse("XXX")).mkString("\t")
  }
}

如果要使用productIterator,它是一个Iterator [Any],因此您需要模式匹配才能使用Options。

case class Lr(some1_ID : Option[String], some2_ID : Option[String]) {
  def getData: String = {
    productIterator.collect {
      case Some(value) => value
   // case None => "ALTERNATIVE VALUE"
   // case others => others   (non Option fields)
    }.mkString("\t") 
  }
}

答案 1 :(得分:1)

您要为None打印什么?确定之后,您可以执行类似的操作

 def getData: String =
    Seq( 
      some1_ID.getOrElse("-"),
      some2_ID.getOrElse("-")
    ).mkString("\t")