3 回答
TA贡献1860条经验 获得超9个赞
您可以根据某些条件先将它们分组。在本文中,我将仅说明下划线字符和右箭头。
_._包含句点。Scala中的句点始终表示方法调用。因此,在句号的左边有接收方,在消息的右边(方法名)。现在_是Scala中的特殊符号。关于它有几篇文章,例如此博客条目所有用例。在这里,这是一个匿名函数的捷径,这是一个接受一个参数并_在其上调用方法的函数的快捷方式。现在_不是有效的方法,因此很可能您已经看到_._1或类似的东西,即_._1在函数参数上调用方法。_1to _22是提取元组特定元素的元组方法。例:
val tup = ("Hallo", 33)
tup._1 // extracts "Hallo"
tup._2 // extracts 33
现在,假设函数应用程序快捷方式的用例。给定一个将整数映射到字符串的映射:
val coll = Map(1 -> "Eins", 2 -> "Zwei", 3 -> "Drei")
糟糕,标点符号已经再次出现。连字符和大于号字符(类似于右箭头)是产生的运算符Tuple2。因此,无论编写(1, "Eins")或的结果都没有区别1 -> "Eins",只是后者更易于阅读,尤其是在像地图示例这样的元组列表中。该->是什么神奇的,它是像其他一些运营商,可因为你把所有的隐式转换的对象scala.Predef范围。这里发生的转换是
implicit def any2ArrowAssoc [A] (x: A): ArrowAssoc[A]
哪里ArrowAssoc有->创建的方法Tuple2。因此1 -> "Eins"是实际的呼叫Predef.any2ArrowAssoc(1).->("Eins")。好。现在回到带有下划线字符的原始问题:
// lets create a sequence from the map by returning the
// values in reverse.
coll.map(_._2.reverse) // yields List(sniE, iewZ, ierD)
这里的下划线缩短了以下等效代码:
coll.map(tup => tup._2.reverse)
请注意,mapMap 的方法将键和值的元组传递给函数参数。因为我们只对值(字符串)感兴趣,所以我们使用_2元组上的方法提取它们。
添加回答
举报