如何解释“Set(someList:_ *)”的结果与“Set(someList).flatten”相同

时间:2013-06-25 14:36:12

标签: scala

我找到了一段代码,我前段时间使用_ *从对象列表中创建了一个扁平的集合。

真正的代码行有点复杂,因为我不记得为什么会这样,需要进行一些实验来理解效果,这实际上非常简单,如下面的REPL会话所示: / p>

scala> val someList = List("a","a","b")
someList: List[java.lang.String] = List(a, a, b)

scala> val x = Set(someList: _*)
x: scala.collection.immutable.Set[java.lang.String] = Set(a, b)

scala> val y = Set(someList).flatten
y: scala.collection.immutable.Set[java.lang.String] = Set(a, b)

scala> x == y
res0: Boolean = true

作为没有展平的事情的参考:

scala> val z = Set(someList)
z: scala.collection.immutable.Set[List[java.lang.String]] = Set(List(a, a, b))

因为我不记得我从哪里得到那个成语我想知道那里发生了什么,以及是否有任何后果(除了可读性影响)

PS:可能是Scala语言(IMHO)中过度使用下划线的结果,很难找到有关其某些用例的文档,特别是如果它与通常用作通配符的符号一起使用的话。大多数搜索引擎。

1 个答案:

答案 0 :(得分:4)

_*用于扩展此集合,就好像它是按字面意思写的一样,所以

val x = Set(Seq(1,2,3,4): _*)

相同
val x = Set(1,2,3,4)

然而,Set(someList)将someList视为单个参数。

要查找时髦符号,您可以使用symbolhound