2015-03-25 1 views
7

las ich ein Quellcode des Projekts gefunden:Apache-Spark: Wofür ist map (_._ 2) eine Abkürzung?

val sampleMBR = inputMBR.map(_._2).sample 

inputMBR ist ein Tupel.

die Funktion map ‚s Definition lautet:

map[U classTag](f:T=>U):RDD[U] 

es scheint, dass map(_._2) die Abkürzung für map(x => (x._2)) ist.

Jeder kann mir Regeln dieser Kurzschrift sagen?

Antwort

11

Die Syntax kann ein wenig verwirrend sein. Wenn _ alleine verwendet wird, stellt es ein Argument in der anonymen Funktion dar. Also, wenn wir an Paaren arbeiten: map(_._2 + _._2) wäre Kurzschrift für map(x, y => x._2 + y._2). Wenn _ als Teil eines Funktionsnamens (oder Wertnamens) verwendet wird, hat es keine besondere Bedeutung. In diesem Fall gibt x._2 das zweite Element eines Tupels zurück (unter der Annahme, dass x ein Tupel ist).

6

collection.map (_._ 2) gibt eine zweite Komponente des Tupels aus. Beispiel aus reinem Scala (Spark RDDs funktionieren auf die gleiche Weise):

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

Das ist klar !! – Jordon

0

Ich habe die Lösungen gefunden.

Zuerst ist die underscore hier als Platzhalter.

Um eine Funktionsliteral noch prägnanter zu machen, Sie Unterstrichen für einen oder mehrere Parameter als Platzhalter verwenden können, solange die einzelnen Parameter wörtlichen nur ein einziges Mal in der Funktion erscheint.

Weitere Informationen über underscore in Scala unter What are all the uses of an underscore in Scala?.

3

Zwei Unterstriche in '_._2' sind unterschiedlich.

Zuerst '_' ist für Platzhalter der anonymen Funktion; Zweite '_2' ist Mitglied der Fallklasse Tuple.

Etwas wie:

Fallklasse Tuple3 (_1: T1, _2: T2, _3: T3) {...}

0

Der erste ' _ 'bezieht sich darauf, was zugeordnet ist, und da ein Tupel zugeordnet ist, können Sie jede Funktion innerhalb des Tupels aufrufen, und eine der Methoden ist' _2 '. Nachstehend wird die Eingabe in das zweite Attribut umgewandelt.