2015-03-25 28 views
7

我讀了項目的源代碼,發現: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))的簡寫。

任何人都可以告訴我這些簡寫的規則嗎?

回答

11

_語法可能有點混亂。當_被單獨使用時,它代表了匿名函數中的一個參數。所以,如果我們在配對上工作: map(_._2 + _._2)將是map(x, y => x._2 + y._2)的簡寫。當_用作函數名稱(或數值名稱)的一部分時,它沒有特殊含義。在這種情況下,x._2返回元組的第二個元素(假設x是一個元組)。

6

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) 
+1

這是明確的! – Jordon 2017-02-04 18:17:20

0

我找到了解決方案。

首先underscore這裏是佔位符

爲了讓函數文本更簡潔,您可以使用下劃線 作爲佔位符的一個或多個參數,只要 僅出現一個函數字面時間內每個參數。

在Scala的What are all the uses of an underscore in Scala?查看更多about underscore

3

兩個下劃線在 '_._2' 是不同的。

第一 '_' 爲佔位符匿名函數;第二'_2'是成員案件類別Tuple

是這樣的:

情況下類Tuple3(_1:T1,_2:T2,_3:T3) {...}

0

第一' _'指的是映射到的內容,因爲映射到的是元組,您可以調用元組內的任何函數,其中一個方法是'_2',所以下面的內容告訴我們將輸入轉換爲第二個屬性。