为什么不 Map#removeAll(Collection<?>)?

2022-09-02 22:00:06

为什么Java中的接口没有像它那样删除键的方法?MapremoveAll(Collection<?> c)map.remove(Object)

我知道我总是可以做到..但这是一个没有的理由,并鼓励我们去?map.keySet().removeAll(..)MapremoveAll()map.keySet().removeAll(..)


答案 1

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

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

关于接口设计的更一般的问题:为什么接口X没有方便的方法Y?在Martin Fowler关于MinimalInterfaceHumaneInterface的讨论中得到了更深入的解决。


答案 2

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

想想这样的情况:

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

地图可以提供以下方法:

  • removeAllKeys() - 参数是键的集合
  • removeAllValues() - 参数是值的集合
  • removeAllEntries() - 参数是对的集合,如果只有值由键映射,则删除条目。如果 map 中存在具有 diffrend 键的值,反之亦然,则不会删除该条目

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

所以把 remove所有方法都放到 Map 接口上不清楚要了解哪些类型的对象应该被检查和删除——键、值、两者还是对。