我讀了項目的源代碼,發現:Apache-Spark:什麼是map(_._ 2)的簡寫?
val sampleMBR = inputMBR.map(_._2).sample
inputMBR
是一個元組。
功能map
的定義是:
map[U classTag](f:T=>U):RDD[U]
似乎map(_._2)
是map(x => (x._2))
的簡寫。
任何人都可以告訴我這些簡寫的規則嗎?
我讀了項目的源代碼,發現:Apache-Spark:什麼是map(_._ 2)的簡寫?
val sampleMBR = inputMBR.map(_._2).sample
inputMBR
是一個元組。
功能map
的定義是:
map[U classTag](f:T=>U):RDD[U]
似乎map(_._2)
是map(x => (x._2))
的簡寫。
任何人都可以告訴我這些簡寫的規則嗎?
_語法可能有點混亂。當_被單獨使用時,它代表了匿名函數中的一個參數。所以,如果我們在配對上工作: map(_._2 + _._2)
將是map(x, y => x._2 + y._2)
的簡寫。當_用作函數名稱(或數值名稱)的一部分時,它沒有特殊含義。在這種情況下,x._2
返回元組的第二個元素(假設x是一個元組)。
collection.map(_._ 2)發射的元組的第二組件。來自純斯卡拉的例子(Spark RDDs以同樣的方式工作):
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)
我找到了解決方案。
首先underscore
這裏是佔位符。
爲了讓函數文本更簡潔,您可以使用下劃線 作爲佔位符的一個或多個參數,只要 僅出現一個函數字面時間內每個參數。
在Scala的What are all the uses of an underscore in Scala?查看更多about underscore
。
兩個下劃線在 '_._2
' 是不同的。
第一 '_
' 爲佔位符匿名函數;第二'_2
'是成員案件類別Tuple
。
是這樣的:
情況下類Tuple3(_1:T1,_2:T2,_3:T3) {...}
第一' _'指的是映射到的內容,因爲映射到的是元組,您可以調用元組內的任何函數,其中一個方法是'_2',所以下面的內容告訴我們將輸入轉換爲第二個屬性。
這是明確的! – Jordon 2017-02-04 18:17:20