gpt4 book ai didi

scala - 有没有一种有效的方法来避免使用 mapValues 进行重复评估?

转载 作者:行者123 更新时间:2023-12-02 00:56:48 26 4
gpt4 key购买 nike

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 转换为 map,也是如此。

view方法会把一个严格的Map变成一个非严格的Map,但是好像没有方法可以做恰恰相反。

最佳答案

您可以在 View 上调用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 表现得更好,但是,即使它确实如此,与噪声和不便相比,差异可能可以忽略不计您需要为 2.11 或 2.12 和 future 的 Scala 版本交叉构建,这些版本将修复 mapValues 并完全更改 View 系统。

关于scala - 有没有一种有效的方法来避免使用 mapValues 进行重复评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53777397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com