加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – mapValues和Map中的变换之间的差异

发布时间:2020-12-16 09:28:43 所属栏目:安全 来源:网络整理
导读:在Scala Map中(见 API)mapValues和transform之间的语义和性能有什么不同? 例如,对于任何给定的地图 val m = Map( "a" - 2,"b" - 3 ) 都 m.mapValues(_ * 5)m.transform( (k,v) = v * 5 ) 提供相同的结果. 解决方法 假设我们有一张地图[A,B].澄清一下:我总
在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))}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读