我读了一个项目的源代码,发现:
val sampleMBR = inputMBR.map(_._2).sample
inputMBR
是一个元组。
函数map
的定义是:
map[U classTag](f:T=>U):RDD[U]
似乎map(_._2)
是map(x => (x._2))
的缩写。
任何人都可以告诉我这些速记的规则吗?
答案 0 :(得分:16)
_语法可能有点令人困惑。当_本身使用时,它表示匿名函数中的参数。所以如果我们在成对上工作:
map(_._2 + _._2)
将是map(x, y => x._2 + y._2)
的简写。当_用作函数名称(或值名称)的一部分时,它没有特殊含义。在这种情况下,x._2
返回元组的第二个元素(假设x是一个元组)。
答案 1 :(得分:11)
collection.map(_._ 2)发出元组的第二个组件。来自纯Scala的示例(Spark RDD以相同的方式工作):
scala> val zipped = (1 to 10).zip('a' to 'j')
zipped: scala.collection.immutable.IndexedSeq[(Int, Char)] = Vector((1,a), (2,b), (3,c), (4,d), (5,e), (6,f), (7,g), (8,h), (9,i), (10,j))
scala> val justLetters = zipped.map(_._2)
justLetters: scala.collection.immutable.IndexedSeq[Char] = Vector(a, b, c, d, e, f, g, h, i, j)
答案 2 :(得分:5)
' _._2
'中的两个下划线是不同的。
首先' _
'用于匿名函数的占位符;第二个_2
'是案例类Tuple
的成员。
类似的东西:
案例类Tuple3( _1 :T1, _2 :T2, _3 :T3) {...}
答案 3 :(得分:0)
我找到了解决方案。
首先underscore
此处为占位符。
为了使函数文字更简洁,您可以使用下划线 作为一个或多个参数的占位符,只要每个参数 在函数文字中只出现一次。
在What are all the uses of an underscore in Scala?处详细了解Scala中的underscore
。
答案 4 :(得分:0)
第一个'_'指的是映射到的内容,因为映射到的是元组,你可以调用元组中的任何函数,其中一个方法是'_2',所以下面告诉我们将输入转换为它的第二个属性。