在这样的函数中:
def row(line: List[String]): Row = { Row(line(0), line(1), line(2), line(3).toInt, line(4), line(5), line(6), line(7), line(8), line(9)) }
有没有简单的方法将所有List元素作为参数发送,而不是列出List
的每个元素?类似的东西:
def row(line: List[String]): Row = { Row(line.foreach) }
当我们不知道传入的List的大小时,这会很有用。
在Golang中,有一个点点功能:arrayName...
可以完成此任务。想知道Scala是否有办法做同样的事情。
答案 0 :(得分:1)
Assuming that Row
is the Row
from Spark, you can splat into a Row
:
scala> def row(l: List[String]): Row = Row(l:_*)
row: (l: List[String])org.apache.spark.sql.Row
scala> row(List("a","b","c"))
res1: org.apache.spark.sql.Row = [a,b,c]
(:_*
requires a variable number of arguments.) You'd have to deal with the conversion to an Int
separately.
答案 1 :(得分:0)
如果Row
是案例类,我可以考虑两种方法。
一种方法是在line
case class Row(a: Int, b: Int, c: Int)
val line = List(1, 2, 3)
def row(line: List[Int]): Row = line match {
case List(a, b, c) => Row(a, b, c)
}
row(line)
// Row(1, 2, 3)
第二个是使用元组而不是列表:
case class Row(a: Int, b: Int, c: Int)
val line = (1, 2, 3)
def row(line: (Int, Int, Int)): Row = Row.tupled(line)
row(line)
// Row(1,2,3)
如果Row
确实是一个案例类,我建议创建一些抽象而不是用10个成员变量初始化类
如果Row
是类型别名,您可以使用*
解压缩 args列表,然后使用:_*
,即{{1}的类型声明(变长参数列表)
vararg