我无法理解/ reason之间的区别,例如,immutable.Map.transform和immutable.Map.map。看起来变换不会改变键,但这似乎是map方法的一个微不足道的变化。我错过了什么吗?
我希望找到一种方法,当/如果访问该元素时,将一个函数应用于地图的(键,值)(而不是必须使用map函数急切地迭代地图)。这种方法存在吗?
答案 0 :(得分:4)
您可以使用mapValues
执行此操作。以下是文档中的解释:
def mapValues [C](f:(B)⇒C):地图[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
}
答案 1 :(得分:3)
如果您只需要PartialFunction
的界面,则可以利用Map
继承自PartialFunction
的事实:
val m = Map(1 -> "foo", 2 -> "bar")
val n = m.andThen(_.reverse)
n(1) // --> oof