scala – mapValues和Map中的变换之间的差异
在Scala Map中(见
API)mapValues和transform之间的语义和性能有什么不同?
例如,对于任何给定的地图 val m = Map( "a" -> 2,"b" -> 3 ) 都 m.mapValues(_ * 5) m.transform( (k,v) => v * 5 ) 提供相同的结果. 解决方法
假设我们有一张地图[A,B].澄清一下:我总是指一个不可变的地图.
mapValues采用函数B => C,其中C是值的新类型. transform取一个函数(A,B)=> C,其中C也是值的类型. 所以两者都会产生Map [A??,C]. 但是,使用变换功能,您可以通过键的值来影响新值的结果. 例如: val m = Map( "a" -> 2,"b" -> 3 ) m.transform((key,value) => key + value) //Map[String,String](a -> a2,b -> b3) 使用mapValues执行此操作将非常困难. 下一个区别是transform是严格的,而mapValues只给你一个视图,它不会存储更新的元素.它看起来像这样: protected class MappedValues[C](f: B => C) extends AbstractMap[A,C] with DefaultMap[A,C] { override def foreach[D](g: ((A,C)) => D): Unit = for ((k,v) <- self) g((k,f(v))) def iterator = for ((k,v) <- self.iterator) yield (k,f(v)) override def size = self.size override def contains(key: A) = self.contains(key) def get(key: A) = self.get(key).map(f) } (摘自https://github.com/scala/scala/blob/v2.11.2/src/library/scala/collection/MapLike.scala#L244) 因此,性能方面取决于更有效的方法.如果f很昂贵并且您只访问结果映射的一些元素,则mapValues可能会更好,因为f仅在需要时应用.否则我会坚持地图或变换. 变换也可以用map表示.假设m:Map [A??,B]和f:(A,然后 m.transform(f)相当于m.map {case(a,b)=> (a,f(a,b))} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |