【问题标题】:scala 2.8 collections inconsistency?scala 2.8集合不一致?
【发布时间】:2011-04-12 00:10:53
【问题描述】:

为什么方法 transformmap 的就地突变版本)和 retainfilter 的就地突变版本)仅在 mutable.Map 上定义,而不在 mutable.Buffer 和 @ 上定义987654327@?不应该所有可变集合都支持这些方法吗?

【问题讨论】:

  • 还有一件事。 immutable.MapLike 有方法transform,但没有方法retain
  • @michael:我已经更新了我的答案以考虑到这种差异。

标签: scala scala-collections scala-2.8


【解决方案1】:

Map 的操作retaintransform关于键和值,这些概念不属于Set 或@987654323 @。

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

但你的操作列在:

可变映射支持另外下表中总结的操作。

ms transform f

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

ms retain p

仅保留ms 中具有key 满足谓词p 的那些映射。


one-zero-zero-onecmets:

retaintransform 基本上分别是filtermap 的就地突变版本,可以在SetBuffer 上轻松定义。
我不明白他们是如何Map-specific。

我认为 retaintransform 提供特定于 Map 的实现(因为它们的实现专门处理键和值),用于类似于 @ 的 mapfilter 提供的特性987654327@.

SetBuffer 中实现transform 不会增加任何价值,因为它只会推迟到map


注意:Michael Kebecmets:

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

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

然而,如果 transform 通过过滤和转换现有地图的绑定来生成新地图,这似乎符合transformation operations 的性质。

这里是source code for 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
}

Source code for 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
}

【讨论】:

  • -1、retaintransform 基本上分别是filtermap 的就地突变版本,可以在SetBuffer 上轻松定义。我不明白他们是如何Map-specific。
  • @one:记录它们的方式涉及特定于地图的概念。但你是对的,它们可以扩展到 Set 和 Buffer。然而,由于filtermap 已经存在,可能对SetBuffer 来说这不是必需的。
  • @one-zero-zero-one:我已更新我的答案以反映您的评论。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2011-01-10
  • 2011-02-01
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多