在scala中“:\*”是什么意思(使用列表筛选Dataframe时)

km0tfn4u  于 2021-05-29  发布在  Spark
关注(0)|答案(3)|浏览(1239)

这个问题在这里已经有答案了

“:*”(冒号-下划线-星形)在scala中做什么(4个答案)
六个月前关门了。
当看到一些同事的scala spark代码时,有时我会遇到他们使用列表来过滤Dataframe,如本例所示:

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

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

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

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

我不明白的是,那“星星”是什么 :_* 你到底在干什么?
提前谢谢!

pftdvrlh

pftdvrlh1#

如果任何方法包含 repeated parameter . 如果你想通过任何考试 Iterable 在方法的 repeated parameter ,以转换 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

ej83mcc0

ej83mcc02#

这有时被称为 splat 接线员。它用于调整序列(array、list、seq、vector等),以便将其作为varargs方法参数的参数传递:

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

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

7d7tgy0s3#

它的意思是“传递列表作为一个单独的参数”。它适用于具有vararg参数的方法,如“任意数量的字符串”,但不适用于 List[String] 版本。
Spark isin 函数有签名 isin(list: Any*): Column , Any* 表示“任意类型的任意数量的参数”。不是很有描述性,但是在这里您可以传递任意数量的字符串,或者任意数量的列。与 :_* 语法,你对编译器说“用varargs替换我的列表”,这等同于写 .isin("0661", "0239" ...) 另外,由于spark 2.4.0 isInCollection ,这需要 Iterable ,所以你可以通过 List 就在那里。

相关问题