Scala 从case类中获取所有实体并将其转换为字符串

Scala 从case类中获取所有实体并将其转换为字符串,scala,apache-spark,Scala,Apache Spark,我有一个案例类,如下所示: 案例类Class1(字段1:字符串, 字段2:选项[字符串]=无, var var1:选项[字符串]=无, var var2:选项[布尔]=无, var var3:选项[Double]=无 ) 变量列表稍微长一点。现在我想将类中的所有变量转换为字符串。Say选项[]必须省略,而且布尔值、双精度和数字必须转换为字符串类型。我的第一个方法是: def anyOptionalToString(class1Dataset: Dataset[Class1]): DataFra

我有一个案例类,如下所示:

案例类Class1(字段1:字符串,
字段2:选项[字符串]=无,
var var1:选项[字符串]=无,
var var2:选项[布尔]=无,
var var3:选项[Double]=无
)
变量列表稍微长一点。现在我想将类中的所有变量转换为字符串。Say
选项[]
必须省略,而且
布尔值
双精度
数字
必须转换为字符串类型。我的第一个方法是:

def anyOptionalToString(class1Dataset: Dataset[Class1]): DataFrame = {
    val ds1 = class1Dataset.map { class1 =>
        (
          class1.field1,
          class1.field2.getOrElse(""),
          class1.var1.getOrElse(""),
          class1.var2.getOrElse(false),
          class1.var3.getOrElse(-1.0)
        )
 }
有没有一种方法可以在不调用每个字段的情况下使用它们?
以一种
循环
或类似的方式说话?

我要做的是创建一个新的
序列
,其中包含您想要的默认值。比如说:

val defaults = Seq("", "", "", false, -1)
现在,我们可以使用来迭代现有元素,并选择是使用现有值还是默认值:

val c1 = Class1("f1", Some("f2"), None, Some(true), Some(3))
c1.productIterator.zip(defaults.iterator).map {
  case (None, default) => default
  case (Some(value), _) => value
  case (value, _) => value
}.map(_.toString)

上面代码的结果类型是
迭代器[String]
。代码运行可在。

查找模式匹配?您也可以简单地在case类上执行toString。有点不清楚你想做什么。也许您最好添加更多代码和这些转换的结果?。如果您需要将异构类型的值收集到一个新类型中,您将需要类似于HList的内容,这是一个高级主题。嘿,谢谢您的快速响应,很抱歉我的错误描述。我主要想封装case类,并创建一个新的构造,其中包含与string相同的字段。我已经改变了上面的描述,希望我能表达得更清楚一点。新的构造是另一个Specific T类型?,例如,一个新的case类?