8

例如,我无法理解 immutable.Map.transform 和 immutable.Map.map 之间的区别/原因。看起来 transform 不会改变键,但这似乎只是 map 方法的一个微不足道的变化。我错过了什么吗?

我期待找到一种方法,当/如果访问该元素时(而不是必须用 map 函数急切地遍历地图),将函数应用于地图的(键,值)。这样的方法存在吗?

4

2 回答 2

4

您可以使用mapValues. 以下是文档的解释:

def mapValues[C](f: (B) ⇒ C): Map[A, C]

通过将函数应用于每个检索到的值来转换此映射。

f - 用于转换此地图值的函数。

返回- 一个映射视图,它将映射的每个键映射到 f(this(key))。生成的地图包装原始地图而不复制任何元素。

编辑

虽然扩展集合 API 的类通常不是一个好主意,但它可以像这样工作:

class LazilyModifiedMap[A,B,C](underlying: Map[A,B])(f: (A,B) => C) extends Map[A,C] {
  def get(key: A) = underlying.get(key).map( x => f(key, x))

  def iterator = underlying.iterator.map { case (k,v) => (k, f(k,v)) }

  def -(key: A) = iterator.toMap - key

  def +[C1 >: C](kv: (A,C1)) = iterator.toMap + kv
}
于 2013-05-24T14:22:17.203 回答
3

如果只需要 的接口,则可以利用继承自PartialFunction的事实:MapPartialFunction

val m = Map(1 -> "foo", 2 -> "bar")
val n = m.andThen(_.reverse)

n(1)  // --> oof
于 2013-05-24T21:44:00.750 回答