拓哥的代码发现很多地方都用到了:_*,今天探个究竟。
1.变长参数
例如定义一个变长参数的方法sum,然后计算1-5的和,可以写为
-
scala> def sum(args: Int*) = {
-
| var result = 0
-
| for (arg <- args) result += arg
-
| result
-
| }
-
sum: (args: Int*)Int
-
-
scala> val s = sum(1,2,3,4,5)
-
s: Int = 15
但是如果使用这种方式就会报错
-
scala> val s = sum(1 to 5)
-
<console>:12: error: type mismatch;
-
found : scala.collection.immutable.Range.Inclusive
-
required: Int
-
val s = sum(1 to 5)
-
^
这种情况必须在后面写上: _*将1 to 5转化为参数序列
-
scala> val s = sum(1 to 5: _*)
-
s: Int = 15
2.变量声明中的模式
例如,下面代码分别将arr中的第一个和第二个值赋给first和second
scala> val arr = Array(1,2,3,4,5)
arr: Array[Int] = Array(1, 2, 3, 4, 5)
scala> val Array(1, 2, _*) = arr
scala> val Array(first, second, _*) = arr
first: Int = 1
second: Int = 2
项目中的代码
addColumns.foreach(column => {
if (column.udf != null && column.inputColumns != null) {
result = result.withColumn(column.name, column.udf(column.inputColumns.map(col): _*))
} else if (column.expression != null) {
result = result.withColumn(column.name, expr(column.expression))
}
}
)
inputColumns是一个List,
inputColumns.map(col):_*展平成为一个序列参数传递给udf函数