7

为什么方法transform(就地突变版本map)和retain(就地突变版本filter)仅定义在mutable.Map而不是定义在mutable.Buffer和上mutable.Set?不应该所有可变集合都支持这些方法吗?

4

1 回答 1

8

retaintransformof的操作Map关于键和值的,它们不是 aSet或 a 的一部分Buffer

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

但是您的操作列在:

可变映射还支持下表总结的操作。

ms transform f

ms使用 function转换 map 中的所有关联值f

ms retain p

仅保留那些ms具有key令人满意的映射的 predicate p


一零零一评论:

retain和本质上分别是和transform的就地突变版本,可以很容易地在和上定义。 我看不出它们是如何特定的。filtermapSetBuffer
Map

我会争辩说,retaintransform提供特定于 Map 的实现(因为它们的实现专门处理键和值),用于诸如由mapfilterfrom提供的特性TraversableLike

实施transforminSetBuffer不会增加任何价值,因为它只会推迟到map.


注:Michael Kebe评论:

还有一件事。immutable.MapLike有方法transform,但没有方法retain

(相对于mutable.MapLike两者都有)

然而,如果 transform通过过滤和转换现有映射的绑定来生成新映射,这似乎符合转换操作的性质。

这是转换的源代码

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
}

但是,源代码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
}
于 2010-09-14T06:09:33.197 回答