Почему не Map # removeAll (Collection <?>)?
Почему интерфейс Map
в Java не имеет метода removeAll(Collection<?> c)
для удаления ключей, например, он имеет map.remove(Object)
?
Я знаю, что всегда могу сделать map.keySet().removeAll(..)
.. но это причина, по которой Map
не имеет removeAll()
и призывает нас пойти с map.keySet().removeAll(..)
?
Ответы
Ответ 1
Философия API-интерфейсов коллекций должна быть как можно более малой и простой. Представления коллекции на карте позволяют выполнить эту операцию уже, поэтому нет необходимости в дополнительном методе.
Метод keySet возвращает представление карты. Операции над набором клавиш отражены на карте.
Более общий вопрос о дизайне интерфейса: почему интерфейс X не имеет удобного метода Y? более подробно рассматривается Мартином Фаулером в обсуждении MinimalInterface vs HumaneInterface.
Ответ 2
Поскольку Map is not Collection не расширяет интерфейс Collection. Реализации карт Интерфейс сбора USE, чтобы обеспечить им собственную функциональность.
Подумайте о такой ситуации:
- У вас есть карта с методом removeAll (..).
- Вы вызываете этот метод и удаляете карту...
- и что они должны удалить? Ключи, значения или пары - записи - ключ: значение?
Карта может предоставлять методы:
- removeAllKeys() - параметр - это набор ключей
- removeAllValues () - параметр представляет собой набор значений
- removeAllEntries() - параметр представляет собой коллекцию пары и удаляет запись, если только значение отображается по ключу. Если на карте существует значение с ключом diffrend или наоборот, то эта запись не удаляется.
но в этом случае у вас есть три метода, а не один.
Таким образом, метод removeAll для интерфейса Map не ясен, чтобы понять, какие типы объектов должны быть проверены и удалены - ключи, значение, обе или пары.