### Question:
GroupingListMultiMap implements DisposableMap<K, List<V>>, ListEventListener<List<V>> { @Override public void dispose() { valueList.removeListEventListener(this); valueList.dispose(); groupingList.dispose(); keySet = null; entrySet = null; keyList.clear(); delegate.clear(); } GroupingListMultiMap(EventList<V> source, FunctionList.Function<V, ? extends K> keyFunction, Comparator<? super K> keyGrouper); @Override void dispose(); @Override int size(); @Override boolean isEmpty(); @Override boolean containsKey(Object key); @Override boolean containsValue(Object value); @Override List<V> get(Object key); @Override List<V> put(K key, List<V> value); @Override void putAll(Map<? extends K, ? extends List<V>> m); @Override void clear(); @Override List<V> remove(Object key); @Override Collection<List<V>> values(); @Override Set<K> keySet(); @Override Set<Entry<K, List<V>>> entrySet(); @Override boolean equals(Object o); @Override int hashCode(); @Override void listChanged(ListEvent<List<V>> listChanges);  }### Answer:
@Test public void testDispose() { final EventList<String> source = new BasicEventList<>(); final DisposableMap<Comparable<String>, List<String>> eventMap = GlazedLists.syncEventListToMultiMap(source, new FirstLetterFunction()); source.addAll(GlazedListsTests.delimitedStringToList("Jesse Jiries")); source.addAll(GlazedListsTests.delimitedStringToList("Katie")); source.addAll(GlazedListsTests.delimitedStringToList("Wilson")); assertEquals(3, eventMap.size()); eventMap.dispose(); }