根据Map对象上map方法的scaladoc,它应该返回一个新的Map:
def map [B] (f: ((A, B)) ⇒ B) : Map[B]
“返回一个新的地图,该地图是将给定的函数f应用于此地图的每个元素并收集结果。”
但事实并非如此:
scala> val countries = Map("NO" -> "Norway", "US" -> "United States", "DE" -> "Germany")
countries: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((NO,Norway), (US,United States), (DE,Germany))
countries map { _._1 }
res4: scala.collection.immutable.Iterable[java.lang.String] = List(NO, US, DE)
但是,这种行为是我所期望的。那么文档是错误的,还是我错过了什么?
答案 0 :(得分:5)
您正在阅读错误的地图功能。
def map [B](f :((A,B))⇒B):地图[B]
但你正在使用:
def map [B,That](f:((A,B))⇒B)(隐含的bf:CanBuildFrom [Map [A,B],B,That]):那个
因为你要返回一个字符串,所以你不是使用拳头而是第二个。为此,ScalaDoc说:
“一个新的类型集合,它是通过将给定的函数f应用于此映射的每个元素并收集结果而产生的。”
答案 1 :(得分:5)
Scaladoc的@usecase
加法是相当匆忙构思和实施的,并且有一些皱纹。在这种情况下,用例在Scaladoc中为TraversableLike#map
:
@usecase def map[B](f: A => B): $Coll[B]
$Coll
将使用scala.collection.Map
中定义的值替换为简单文本替换。
/**
* @define Coll Map
* @define coll map
*/
object Map extends MapFactory[Map]
可以做些什么呢?也许文本替换的结果可以进行类型检查,这将排除这些边缘情况。