Scala中_*的应用

拓哥的代码发现很多地方都用到了:_*,今天探个究竟。

1.变长参数 
例如定义一个变长参数的方法sum,然后计算1-5的和,可以写为

  1.  
    scala> def sum(args: Int*) = {
  2.  
    | var result = 0
  3.  
    | for (arg <- args) result += arg
  4.  
    | result
  5.  
    | }
  6.  
    sum: (args: Int*)Int
  7.  
     
  8.  
    scala> val s = sum(1,2,3,4,5)
  9.  
    s: Int = 15

但是如果使用这种方式就会报错

  1.  
    scala> val s = sum( 1 to 5)
  2.  
    <console>: 12: error: type mismatch;
  3.  
    found : scala.collection.immutable.Range.Inclusive
  4.  
    required: Int
  5.  
    val s = sum( 1 to 5)
  6.  
    ^

这种情况必须在后面写上: _*将1 to 5转化为参数序列

  1.  
    scala> val s = sum( to 5: _*)
  2.  
    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函数

猜你喜欢

转载自www.cnblogs.com/muliti-hu/p/11280873.html