在Scala编程中,若函数的参数是可变的,则会被写成String* 的形式,例如在调用Spark的DataFrame 函数 groupBy时的情形:
groupBy 函数原型为:
def groupBy(cols: Column*)
那么在日常调用时可以按照传统的可变参数函数调用方式,写成如下形式:
dfRet.groupBy(dfRet("`年龄分段_2`"),dfRet("`性别_2`"))
这种方式是可以满足日常使用的,特别是应用程序中对col的数量清晰知道的情况下,那么对于应用程序无法预知参数个数的情况,要怎么处理呢?
首先groupBy的参数是可变的,而应用程序又无法确认API调用层传参的具体个数,所以不能按照传统方式调用。然而Scala是一门FP时语言,这样就给我们提供了一个便利的方式来解决这个应用端参数个数未知的应用场景。
首先可以将参数转换成Seq中的元素,例如:
val arr = Seq(dfRet("`年龄分段_2`"),dfRet("`性别_2`"))
然后调用的时候才有如下方式即可:
dfRet.groupBy(arr:_*)
这样的调用方式,即将arr 中的所有元素依次传递到groupBy 函数中。
通过上述方法可以发现,在应用程序参数个数未知的情况下,可以先将参数组装成Seq,然后再调用可变参数函数即可。