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

What does ":_*" mean in scala? (When using a List to filter a dataframe)

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

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

df.filter(col("col1").isin(myList:_*)

上面的代码可以完美运行,但是这个代码不行:

df.filter(col("col1").isin(myList)

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

提前致谢!

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

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

此外,自 Spark 2.4.0 以来,有函数 isInCollection,需要 Iterable,因此您可以直接将 List 传递到那里。

这有时称为splat operator. It is used to to adapt a sequence (Array, List, Seq, Vector, etc.) so it can be passed as an argument for a varargs方法参数:

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

val fruits = List("apple", "banana", "cherry")
printAll(fruits:_*)

如果任何方法包含任何 repeated parameter。如果您想在方法的 repeated parameter 中传递任何 Iterable,要转换您的 Iterable to repeated parameter,您将使用 :_*

def x(y:Int*):Seq[Int]={  // y:Int* is a repeated parameter. 
 y
}


x(List(1,2,3,4):_*)  <--- you are passing List into repeated parameter