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

时间:2018-12-14 10:00:00

标签: scala

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变成非严格的function fetchList(ss){ var select = document.getElementById("storeid"); var options = ss; while (select.options[1]) { select.removeChild(select.options[1]); } for(var i = 0; i < options.length; i++) { var opt = options[i]; var el = document.createElement("option"); el.textContent = opt; el.value = opt; select.appendChild(el); } } ,但似乎没有相反的方法。

1 个答案:

答案 0 :(得分:2)

您可以在视图上调用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以及将来的Scala版本的交叉构建,这些版本将修复mapValues并完全更改视图系统。