":_*" 在 Scala 中是什么意思?(使用列表过滤数据框时)

Dob*_*leR 3 scala list dataframe underscore.js apache-spark

当看到一些同事的 Scala-Spark 代码时,有时我会遇到他们使用列表来过滤数据帧,如下例所示:

val myList: List[String] = List("0661", "0239", "0949", "0380", "0279", "0311")

df.filter(col("col1").isin(myList:_*)
Run Code Online (Sandbox Code Playgroud)

上面的代码工作得很好,但是,这个没有:

df.filter(col("col1").isin(myList)
Run Code Online (Sandbox Code Playgroud)

我不明白的是,那个“冒号下划线星”:_*到底在做什么?

提前致谢!

Ray*_*Ral 6

它的意思是“将列表作为单独的参数传递”。它适用于具有 vararg 参数的方法,例如“任意数量的字符串”,但不适用于版本List[String]

Spark 的isin函数有签名isin(list: Any*): ColumnAny*意思是“任意数量的 Any 类型的参数”。描述性不是很强,但在这里您可以传递任意数量的字符串或任意数量的列。使用:_*语法,您对编译器说“用可变参数替换我的列表”,它相当于编写.isin("0661", "0239" ...)

另外,从 Spark 2.4.0 开始,有 function isInCollection,需要Iterable,所以你可以List直接传递到那里。


Gur*_*ron 6

这有时称为splat运算符。它用于调整序列(数组、列表、序列、向量等),因此它可以作为可变参数方法参数的参数传递:

def printAll(strings: String*):Unit = {
    strings.foreach(println)
  }

val fruits = List("apple", "banana", "cherry")
printAll(fruits:_*)
Run Code Online (Sandbox Code Playgroud)