scala 2.8集合不一致?

时间:2010-09-14 05:53:16

标签: scala scala-collections scala-2.8

为什么方法transformmap的就地变异版本)和retainfilter的就地变异版本)仅在{{1}上定义但不在mutable.Mapmutable.Buffer上?所有可变集合都不支持这些方法吗?

1 个答案:

答案 0 :(得分:8)

Map 的操作retaintransform 关于键和值,这些概念不属于{ {3}}或Set

  

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

但您的操作列在:

  

可变地图支持 以及 下表中汇总的操作。

ms transform f
  

使用函数ms转换地图f中的所有关联值。

ms retain p
  

仅保留ms中具有key令人满意的谓词p的映射。


Buffer评论:

  

retaintransform基本上分别是filtermap的就地变种版本,可以在Set和{{1}上轻松定义}。
  我不知道它们是如何Buffer - 具体的。

我认为Mapretainone-zero-zero-one和{{}提供的功能提供特定于地图的实现(因为它们的实现专门处理键和值) 3}}来自 map

transformtransform中实施Set会增加一些价值,因为它只会对Buffer产生影响。


注意:filter评论:

  

还有一件事。 TraversableLike使用方法map,但不使用方法transform

(与Michael Kebe同时存在)

如果转换通过过滤和转换现有地图的绑定来生成新地图,这似乎与immutable.MapLike的性质一致。

以下是mutable.MapLike

retain
然而,

transformation operations修改了当前实例,该实例只能与Mutable对象兼容:

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
}