2015-03-25 270 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',所以下面的内容告诉我们将输入转换为第二个属性。