Scala的集合库包含了代理IterableForwarder
,TraversableForwarder
,SeqForwarder
和代理一样IterableProxy
,MapProxy
,SeqProxy
,SetProxy
,TraversableProxy
,等代理和代理两种委托收集方法到底层集合对象.这两者之间的主要区别在于转发器不会转发会创建相同类型的新集合对象的调用.
在哪种情况下,我更喜欢这些类型中的一种?货运代理为何以及何时有用?如果他们是有用的,为什么会有不MapForwarder
和SetForwarder
?
我假设如果想要使用其他方法为集合构建包装器或者对标准集合进行操作,则最常使用代理.
我正在尝试实现默认值映射,并且我希望过滤器,映射等等,DefaultingMap
以便DefaultingMap
尽可能地生成.这是我最初的实现:
class DefaultingMap[K, V](defaultValue: => V)
extends mutable.HashMap[K, V]
with mutable.MapLike[K, V, DefaultingMap[K, V]] {
override def empty = new DefaultingMap[K, V](defaultValue)
override def default(key: K): V = {
val result = this.defaultValue
this(key) = result
result
}
}
Run Code Online (Sandbox Code Playgroud)
我DefaultingMap
使用时会得到类型的对象filter
,但是当我使用时却没有map
:
scala> val counter = new DefaultingMap[Char, Int](0)
counter: DefaultingMap[Char,Int] = Map()
scala> for (c <- "ababcbbb") counter(c) += 1
scala> counter.filter{case (k, v) => v > 1}
res1: …
Run Code Online (Sandbox Code Playgroud)