以下代码演示了我遇到的问题(在实际情况下SortedMap
键是Joda DateTime
,而地图包含数千个元素。
import java.io.{ByteArrayOutputStream, ObjectOutputStream}
import scala.collection.immutable.SortedMap
object Main extends App {
val s = SortedMap(1 -> "A", 2 -> "B", 3 -> "C")
def f(s: String) = s
val sMap = s.map(kv => kv._1 -> f(kv._2)) // slow: rebuilds Map, as keys could change
val sMapValues = s.mapValues(f) // fast, but creates a view only
val so = new ByteArrayOutputStream
val oos = new ObjectOutputStream(so)
oos.writeObject(s) // works
oos.writeObject(sMap) // works
oos.writeObject(sMapValues) // does not work - view only
oos.close()
so.close()
}
问题是虽然mapValues
具有良好的SortedMap
性能,但结果不是真正的集合而是视图,因此无法序列化。映射键和值的简单解决方案有效,但速度很慢,因为树表示被重建,map
不知道我没有更改键。
是否有SortedMap.mapValues
的快速替代品,它会输出可序列化的结果?
答案 0 :(得分:0)
尝试转换:
val sMapValues = s.transform((_,v) => f(v))
尽管将键和值提供给变换lambda,但结果仅应用于值,键不变。