scala 将 Array[String] 转换为案例类

Posted

技术标签:

【中文标题】scala 将 Array[String] 转换为案例类【英文标题】:scala converting Array[String] to case class 【发布时间】:2015-05-01 23:29:16 【问题描述】:

新手问题,但我经常发现自己在处理文件,解析每一行并将其转换为案例类,以便我可以以更多类似对象的方式进一步使用。在 java 中,现在在 scala 中,我执行相同的程序。

case class ABC(v1: Int, v2: String)
val str = line.split("\t")
val v1 = str(0).toInt
val v2 = str(1)
ABC(v1, v2)

还有比这更短的方法可以从数组创建案例类吗?这变得非常乏味,因为我总是有大量的字段要处理。

【问题讨论】:

看product-collections library。它有很好的csv to seq of case classes functionality 【参考方案1】:

在伴随对象中定义一个parse 方法,该方法接受一个字符串并提取用于构造实例的值,

import util._

case class ABC(v1: Int, v2: String)

object ABC 
  def parse(s: String): Try[ABC] = 
    val Array(v1,v2,_*) = s.split("\t")
    Try(ABC(v1.toInt, v2))
  

注意v1 被转换为Int,我们也从拆分字符串中提取前两项,但可以提取任意数量的项目,然后转换为所需的类型。

那么一个有效的用途包括例如

val v = ABC.parse("12\t ab")

【讨论】:

我建议将其命名为 apply 以外的其他名称(例如 parse),因为许多人会期望 apply 直接获取案例类的成员,并且绝对不会失败正常输入异常。 @TravisBrown 谢谢,同意将方法命名为 apply 证明具有误导性(意料之外的语义 :) 请注意更新... 谢谢,对我来说看起来很合理(我仍然更喜欢Try[ABC] 的结果,但这更多的是个人喜好问题)。 好的,所以这在一个地方(对象)演示了解析逻辑,但在我的情况下它并不买太多,因为我只迭代每个文件一次。我可以做 ABC(arr(0).toInt, arr(1))。我同意 elm 的建议更面向对象,我更喜欢这样。但我一直在寻找的是直接将数组元素以相同顺序转换为案例类的方法。即 arr(0) 被分配给案例类的第一个元素,依此类推。如果无法解析,它还应该进行类型转换并抛出编译或运行时错误 @elm,谢谢!

以上是关于scala 将 Array[String] 转换为案例类的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scala 将 Array[DenseVector] 转换为 CSV

将 Scala 中的任何类型转换为 Array[Byte] 并返回

如何使用scala将特定函数转换为apache spark中的udf函数? [复制]

Scala - 将 RDD[String] 转换为地图

Scala 中有没有办法将 Seq[(String, String)] 转换为 Seq[String]?

Scala 库将数字(Int、Long、Double)与 Array[Byte] 相互转换