Obviously, I respect Martin Fowler and all the people who discuss these topics, but I often doubt that “philosophical thinking” about software development brings significant achievements - and the discussion often ends with people making tough statements.
However, I think that the reason that removeAll() missing is not a "minimalist and humane interface" problem for the same reason as you: I see you can remove the key-value pair by acting on Set<K> returned by keySet() , so the remove(K key) method is also useless.
Perhaps the reason is something more pragmatic, like a question of semantics (I'm going to explain) or frequency of use - and therefore perceived usefulness.
For Collection<E> , removeAll(Collection<?> c) pretty simple to understand: it removes all elements of the collection that are also in c . Its dual addAll(Collection<? extends E> c) .
For a Map that is not a Collection , removeAll(...) can be defined for keys, values, or records, and this can lead to confusion (semantic problem).
So why Map.remove(K key) ? This is provided for convenience. Yes, the approach is a humane interface ; -)
Just kidding. I want to convey that, in my humble opinion, the rules in software development are set out after everything is done, and not earlier, therefore they are often post-hoc-justifications. Maybe Map.remove(K key) exists because someone felt the need to place it there, and not because of a 100% consistent, scientific, reasonable and wise approach to modeling.
They are going to close the question because no one noticed your remark about remove(K key) . I did.:)