首页 > 解决方案 > 有没有一种有效的方法可以避免使用 mapValues 进行重复评估?

问题描述

mapValues方法创建一个新的,通过应用给定的函数将Map查询结果修改为原始结果。Map如果相同的值被查询两次,则传递给的函数mapValues被调用两次。

例如:

case class A(i: Int) {
  print("A")
}
case class B(a: A) {
  print("B")
}
case class C(b: B) {
  print("C")
}

val map = Map("One" -> 1)
  .mapValues(A)
  .mapValues(B)
  .mapValues(C)

val a = map.get("One")
val b = map.get("One")

这将打印出来ABCABC,因为每次查询值时都会创建一组新的案例类。

我怎样才能有效地把它变成一个Map预先计算了mapValues函数的混凝土?Map理想情况下,如果已经有具体值,我想要一个什么都不做的机制。

我知道我可以打电话map.map(identity),但这会重新计算Map似乎效率低下的索引。如果最后一个mapValues转换为 a也是如此map

view方法会将 strictMap变为 non-strict Map,但似乎没有相反的方法。

标签: scala

解决方案


您可以调用force视图来强制评估:

scala> val strictMap = map.view.force
ABCstrictMap: scala.collection.immutable.Map[String,C] = Map(One -> C(B(A(1))))

scala> strictMap.get("One")
res1: Option[C] = Some(C(B(A(1))))

scala> strictMap.get("One")
res2: Option[C] = Some(C(B(A(1))))

不过,我会小心地假设这将比简单map的 .未来的 Scala 版本将mapValues完全修复和更改视图系统。


推荐阅读