“:_ *”在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*): Column
,Any*
表示“任意数量的任何类型的参数”。描述性不强,但在这里您可以传递任意数量的字符串或任意数量的列。
使用 :_*
语法,您是在对编译器说“用可变参数替换我的列表”,这等同于编写 .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
当看到一些同事的 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*): Column
,Any*
表示“任意数量的任何类型的参数”。描述性不强,但在这里您可以传递任意数量的字符串或任意数量的列。
使用 :_*
语法,您是在对编译器说“用可变参数替换我的列表”,这等同于编写 .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