为什么不映射#removeAll(Collection <! - ? - >)?

时间:2011-04-28 10:28:19

标签: java collections

为什么Java中的Map接口没有removeAll(Collection<?> c)方法来删除密钥,就像它有map.remove(Object)一样?

我知道我可以随时map.keySet().removeAll(..) ...但这是Map没有removeAll()的原因,并鼓励我们选择map.keySet().removeAll(..)吗?

2 个答案:

答案 0 :(得分:17)

集合API背后的理念是尽可能小巧简单。 Map上的Collection视图允许您已经执行此操作,因此不需要额外的方法。

keySet方法返回Map的视图。键集上的操作反映在地图上。

关于界面设计的更一般的问题:为什么界面X没有方便的方法Y?由Martin Fowler关于MinimalInterface vs HumaneInterface的讨论更深入地讨论

答案 1 :(得分:1)

因为Map不是Collection,所以不扩展Collection接口。映射实现USE集合接口以提供它们自己的功能。

想想这样的情况:

  • 你有使用removeAll(..)方法的地图。
  • vou调用此方法并映射删除...
  • 那么他们应该删除什么?键,值或对 - 条目 - 键:值?

地图可以提供方法:

  • removeAllKeys() - 参数是键的集合
  • removeAllValues() - 参数是值的集合
  • removeAllEntries() - 如果只按键映射值,则参数是pair和remove条目的集合。如果在map中存在带diffrend键的值,反之亦然,则该条目不会被删除

但在这种情况下,你有三种方法而不是一种。

所以把removeAll方法放到Map接口上并不清楚要理解哪些类型的对象应该检查和删除 - 键,值,两者或对。

相关问题