scala 2.8集合不一致?

use*_*255 7 scala scala-2.8 scala-collections

为什么方法transform(在就地突变版本map)和retain(就地突变版本filter)是只定义mutable.Map,但不mutable.Buffermutable.Set?所有可变集合都不支持这些方法吗?

Von*_*onC 8

的操作retaintransformMap大约键和值,这是不的一部分的概念Set或一个Buffer.

Map是一个Iterable,由成对的键和值组成(也称为映射或关联).
地图上的基本操作与集合上的基本操作类似.

但您的操作列在:

可变的地图支持除了在下表中总结的操作.

ms transform f
Run Code Online (Sandbox Code Playgroud)

ms使用函数转换map中的所有关联值f.

ms retain p
Run Code Online (Sandbox Code Playgroud)

只保留那些ms具有key令人满意的谓词的映射p.


一零零一评论:

retain并且transform基本上是就地变异版本filter和,map并且可以很容易地定义SetBuffer.
我不知道他们是如何Map特定的.

我认为,retaintransform提供具体地图的实现(因为它们的执行情况,特别与键和值交易)像所提供的那些功能mapfilterTraversableLike.

实施transformSet,并Buffer不会增加什么价值,因为它只会deffer来map.


注:Michael Kebe评论:

还有一件事.immutable.MapLike有方法transform,但不是方法retain.

(与之相反mutable.MapLike)

然而,如果变换通过过滤和转换现有地图的绑定来生成新地图,则这似乎与变换操作的性质一致.

这是转换源代码

def transform[C, That](f: (A, B) => C)(implicit bf: CanBuildFrom[This, (A, C), That]): That = {
  val b = bf(repr)
  for ((key, value) <- this) b += ((key, f(key, value)))
  b.result
}
Run Code Online (Sandbox Code Playgroud)

retain但是,源代码修改了当前实例,该实例只能与Mutable对象兼容:

/** Retains only those mappings for which the predicate
 *  `p` returns `true`.
 *
 * @param p  The test predicate 
 */
def retain(p: (A, B) => Boolean): this.type = {
  for ((k, v) <- this ; if !p(k, v))
    this -= k

  this
}
Run Code Online (Sandbox Code Playgroud)