Scala如何在函数中传递整个列表?

时间:2018-03-22 23:04:48

标签: scala apache-spark

在这样的函数中:

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是否有办法做同样的事情。

2 个答案:

答案 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