MultiMap extends HashMap<String, List<V>> { public boolean removeValue(String name, V value) { List<V> lo = get(name); if ((lo == null) || (lo.isEmpty())) { return false; } boolean ret = lo.remove(value); if (lo.isEmpty()) { remove(name); } else { put(name, lo); } return ret; } MultiMap();  MultiMap(Map<String, List<V>> map);  MultiMap(MultiMap<V> map); List<V> getValues(String name); V getValue(String name, int i); String getString(String name); List<V> put(String name, V value); void putAllValues(Map<String, V> input); List<V> putValues(String name, List<V> values); @SafeVarargs final List<V> putValues(String name, V... values); void add(String name, V value); void addValues(String name, List<V> values); void addValues(String name, V[] values); boolean addAllValues(MultiMap<V> map); boolean removeValue(String name, V value); boolean containsSimpleValue(V value); @Override String toString(); Map<String, String[]> toStringArrayMap();  }
@Test void testRemoveValue() { MultiMap<String> mm = new MultiMap<>(); String key = "formats"; mm.putValues(key, "gzip", "jar", "pack200"); assertMapSize(mm, 1); assertValues(mm, key, "gzip", "jar", "pack200"); mm.removeValue(key, "jar"); assertMapSize(mm, 1); assertValues(mm, key, "gzip", "pack200"); }