ListMap extends HashMap<T, List<V>> { public List<V> putValue( T key, V value ) { List<V> list = this.get( key ); list = list == null ? new ArrayList<>() : list; list.add( value ); super.put( key, list ); return null; } ListMap();  ListMap( ListMap<T, V> listMap ); List<V> putValue( T key, V value ); List<V> putValues( T key, Collection<V> values ); void putValueMap( Map<T, V> map ); void putAll( ListMap<T, V> map ); Collection<V> allValues(); Set<V> uniqueValues( ); boolean containsValue( T key, V value ); static ListMap<T, V> getListMap( List<V> values, Function<V, T> keyMapper ); static ListMap<T, U> getListMap( List<V> values, Function<V, T> keyMapper, Function<V, U> valueMapper ); static ListMap<T, V> union( ListMap<T, V> a, ListMap<T, V> b );  }
@Test public void testPutValue() { ListMap<String, Integer> map = new ListMap<>(); map.putValue( "A", 1 ); map.putValue( "B", 2 ); map.putValue( "C", 3 ); map.putValue( "A", 4 ); map.putValue( "B", 5 ); map.putValue( "A", 6 ); assertEquals( Lists.newArrayList( 1, 4, 6 ), map.get( "A" ) ); assertEquals( Lists.newArrayList( 2, 5 ), map.get( "B" ) ); assertEquals( Lists.newArrayList( 3 ), map.get( "C" ) ); assertNull( map.get( "Z" ) ); }