View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.collections4;
18  
19  import java.util.Collection;
20  
21  /**
22   * Defines a map that holds a collection of values against each key.
23   * <p>
24   * A {@code MultiMap} is a Map with slightly different semantics.
25   * Putting a value into the map will add the value to a Collection at that key.
26   * Getting a value will return a Collection, holding all the values put to that key.
27   * </p>
28   * <p>
29   * For example:
30   * </p>
31   * <pre>
32   * MultiMap mhm = new MultiValueMap();
33   * mhm.put(key, "A");
34   * mhm.put(key, "B");
35   * mhm.put(key, "C");
36   * Collection coll = (Collection) mhm.get(key);</pre>
37   * <p>
38   * {@code coll} will be a collection containing "A", "B", "C".
39   * </p>
40   * <p>
41   * NOTE: Additional methods were added to this interface in Commons Collections 3.1.
42   * These were added solely for documentation purposes and do not change the interface
43   * as they were defined in the superinterface {@code Map} anyway.
44   * </p>
45   *
46   * @param <K> the type of the keys in this map
47   * @param <V> the type of the values in this map
48   *
49   * @since 2.0
50   * @deprecated since 4.1, use {@link MultiValuedMap} instead
51   */
52  @Deprecated
53  public interface MultiMap<K, V> extends IterableMap<K, Object> {
54  
55      /**
56       * Checks whether the map contains the value specified.
57       * <p>
58       * Implementations typically check all collections against all keys for the value.
59       * This cannot be mandated due to backwards compatibility of this interface.
60       *
61       * @param value  the value to search for
62       * @return true if the map contains the value
63       * @throws ClassCastException if the value is of an invalid type
64       * @throws NullPointerException if the value is null and null value are invalid
65       */
66      @Override
67      boolean containsValue(Object value);
68  
69      /**
70       * Gets the collection of values associated with the specified key.
71       * <p>
72       * The returned value will implement {@code Collection}. Implementations
73       * are free to declare that they return {@code Collection} subclasses
74       * such as {@code List} or {@code Set}.
75       * <p>
76       * Implementations typically return {@code null} if no values have
77       * been mapped to the key, however the implementation may choose to
78       * return an empty collection.
79       * <p>
80       * Implementations may choose to return a clone of the internal collection.
81       *
82       * @param key  the key to retrieve
83       * @return the {@code Collection} of values, implementations should
84       *  return {@code null} for no mapping, but may return an empty collection
85       * @throws ClassCastException if the key is of an invalid type
86       * @throws NullPointerException if the key is null and null keys are invalid
87       */
88      @Override
89      Object get(Object key); // Cannot use get(K key) as that does not properly implement Map#get
90  
91      /**
92       * Adds the value to the collection associated with the specified key.
93       * <p>
94       * Unlike a normal {@code Map} the previous value is not replaced.
95       * Instead, the new value is added to the collection stored against the key.
96       * The collection may be a {@code List}, {@code Set} or other
97       * collection dependent on implementation.
98       *
99       * @param key  the key to store against
100      * @param value  the value to add to the collection at the key
101      * @return typically the value added if the map changed and null if the map did not change
102      * @throws UnsupportedOperationException if the map is unmodifiable
103      * @throws ClassCastException if the key or value is of an invalid type
104      * @throws NullPointerException if the key or value is null and null is invalid
105      * @throws IllegalArgumentException if the key or value is invalid
106      */
107     @Override
108     Object put(K key, Object value);
109 
110     /**
111      * Removes all values associated with the specified key.
112      * <p>
113      * Implementations typically return {@code null} from a subsequent
114      * {@code get(Object)}, however they may choose to return an empty collection.
115      *
116      * @param key  the key to remove values from
117      * @return the {@code Collection} of values removed, implementations should
118      *  return {@code null} for no mapping found, but may return an empty collection
119      * @throws UnsupportedOperationException if the map is unmodifiable
120      * @throws ClassCastException if the key is of an invalid type
121      * @throws NullPointerException if the key is null and null keys are invalid
122      */
123     @Override
124     Object remove(Object key); // Cannot use remove(K key) as that does not properly implement Map#remove
125 
126     /**
127      * Removes a specific value from map.
128      * <p>
129      * The item is removed from the collection mapped to the specified key.
130      * Other values attached to that key are unaffected.
131      * <p>
132      * If the last value for a key is removed, implementations typically
133      * return {@code null} from a subsequent {@code get(Object)}, however
134      * they may choose to return an empty collection.
135      *
136      * @param key  the key to remove from
137      * @param item  the item to remove
138      * @return {@code true} if the mapping was removed, {@code false} otherwise
139      * @throws UnsupportedOperationException if the map is unmodifiable
140      * @throws ClassCastException if the key or value is of an invalid type
141      * @throws NullPointerException if the key or value is null and null is invalid
142      * @since 4.0 (signature in previous releases: V remove(K, V))
143      */
144     boolean removeMapping(K key, V item);
145 
146     /**
147      * Gets the number of keys in this map.
148      * <p>
149      * Implementations typically return only the count of keys in the map
150      * This cannot be mandated due to backwards compatibility of this interface.
151      *
152      * @return the number of key-collection mappings in this map
153      */
154     @Override
155     int size();
156 
157     /**
158      * Gets a collection containing all the values in the map.
159      * <p>
160      * Implementations typically return a collection containing the combination
161      * of values from all keys.
162      * This cannot be mandated due to backwards compatibility of this interface.
163      *
164      * @return a collection view of the values contained in this map
165      */
166     @Override
167     Collection<Object> values();
168 
169 }