例如,我无法理解 immutable.Map.transform 和 immutable.Map.map 之间的区别/原因。看起来 transform 不会改变键,但这似乎只是 map 方法的一个微不足道的变化。我错过了什么吗?
我期待找到一种方法,当/如果访问该元素时(而不是必须用 map 函数急切地遍历地图),将函数应用于地图的(键,值)。这样的方法存在吗?
例如,我无法理解 immutable.Map.transform 和 immutable.Map.map 之间的区别/原因。看起来 transform 不会改变键,但这似乎只是 map 方法的一个微不足道的变化。我错过了什么吗?
我期待找到一种方法,当/如果访问该元素时(而不是必须用 map 函数急切地遍历地图),将函数应用于地图的(键,值)。这样的方法存在吗?
您可以使用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
}
如果只需要 的接口,则可以利用继承自PartialFunction
的事实:Map
PartialFunction
val m = Map(1 -> "foo", 2 -> "bar")
val n = m.andThen(_.reverse)
n(1) // --> oof