scala - 有没有一种有效的方法可以避免使用 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
,但似乎没有相反的方法。
解决方案
您可以调用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
完全修复和更改视图系统。
推荐阅读
- vba - Select Case - Loop 无图案系列
- javascript - Date() 在本地运行时与在管道中运行时不同
- ios - 尝试滑动弹出当前 viewController 时的确认提示
- python - `poetry run black myscript.py`和`black myscript.py`有什么区别?
- sql - 优化 CTE 查询
- java - Java ESC/POS 图像全幅打印
- python - 如何在 pandas DataFrame 的给定位置插入几行?
- android - com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
- javascript - 如何将我的代码从回调函数更改为承诺
- java - 如何解决执行 com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable 时发生故障