SortedMap.mapValues的快速替代品

时间:2016-11-16 11:58:10

标签: performance scala data-structures

以下代码演示了我遇到的问题(在实际情况下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的快速替代品,它会输出可序列化的结果?

1 个答案:

答案 0 :(得分:0)

尝试转换:

val sMapValues = s.transform((_,v) => f(v))

尽管将键和值提供给变换lambda,但结果仅应用于值,键不变。