为什么在scala中转换和映射方法?

时间:2013-05-24 14:18:54

标签: api scala map lazy-evaluation

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

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

2 个答案:

答案 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