首页 > 解决方案 > 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())
   }
}

标签: scala

解决方案


如果某些属性为无,这取决于您要做什么。

如果你想丢弃无

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") 
  }
}

推荐阅读