001 /*
002 * Copyright (C) 2007 The Guava Authors
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package com.google.common.collect;
018
019 import com.google.common.annotations.GwtCompatible;
020
021 import java.util.Collection;
022 import java.util.Map;
023 import java.util.Set;
024
025 import javax.annotation.Nullable;
026
027 /**
028 * A collection similar to a {@code Map}, but which may associate multiple
029 * values with a single key. If you call {@link #put} twice, with the same key
030 * but different values, the multimap contains mappings from the key to both
031 * values.
032 *
033 * <p>The methods {@link #get}, {@link #keySet}, {@link #keys}, {@link #values},
034 * {@link #entries}, and {@link #asMap} return collections that are views of the
035 * multimap. If the multimap is modifiable, updating it can change the contents
036 * of those collections, and updating the collections will change the multimap.
037 * In contrast, {@link #replaceValues} and {@link #removeAll} return collections
038 * that are independent of subsequent multimap changes.
039 *
040 * <p>Depending on the implementation, a multimap may or may not allow duplicate
041 * key-value pairs. In other words, the multimap contents after adding the same
042 * key and value twice varies between implementations. In multimaps allowing
043 * duplicates, the multimap will contain two mappings, and {@code get} will
044 * return a collection that includes the value twice. In multimaps not
045 * supporting duplicates, the multimap will contain a single mapping from the
046 * key to the value, and {@code get} will return a collection that includes the
047 * value once.
048 *
049 * <p>All methods that alter the multimap are optional, and the views returned
050 * by the multimap may or may not be modifiable. When modification isn't
051 * supported, those methods will throw an {@link UnsupportedOperationException}.
052 *
053 * @author Jared Levy
054 * @param <K> the type of keys maintained by this multimap
055 * @param <V> the type of mapped values
056 * @since 2.0 (imported from Google Collections Library)
057 */
058 @GwtCompatible
059 public interface Multimap<K, V> {
060 // Query Operations
061
062 /** Returns the number of key-value pairs in the multimap. */
063 int size();
064
065 /** Returns {@code true} if the multimap contains no key-value pairs. */
066 boolean isEmpty();
067
068 /**
069 * Returns {@code true} if the multimap contains any values for the specified
070 * key.
071 *
072 * @param key key to search for in multimap
073 */
074 boolean containsKey(@Nullable Object key);
075
076 /**
077 * Returns {@code true} if the multimap contains the specified value for any
078 * key.
079 *
080 * @param value value to search for in multimap
081 */
082 boolean containsValue(@Nullable Object value);
083
084 /**
085 * Returns {@code true} if the multimap contains the specified key-value pair.
086 *
087 * @param key key to search for in multimap
088 * @param value value to search for in multimap
089 */
090 boolean containsEntry(@Nullable Object key, @Nullable Object value);
091
092 // Modification Operations
093
094 /**
095 * Stores a key-value pair in the multimap.
096 *
097 * <p>Some multimap implementations allow duplicate key-value pairs, in which
098 * case {@code put} always adds a new key-value pair and increases the
099 * multimap size by 1. Other implementations prohibit duplicates, and storing
100 * a key-value pair that's already in the multimap has no effect.
101 *
102 * @param key key to store in the multimap
103 * @param value value to store in the multimap
104 * @return {@code true} if the method increased the size of the multimap, or
105 * {@code false} if the multimap already contained the key-value pair and
106 * doesn't allow duplicates
107 */
108 boolean put(@Nullable K key, @Nullable V value);
109
110 /**
111 * Removes a key-value pair from the multimap.
112 *
113 * @param key key of entry to remove from the multimap
114 * @param value value of entry to remove the multimap
115 * @return {@code true} if the multimap changed
116 */
117 boolean remove(@Nullable Object key, @Nullable Object value);
118
119 // Bulk Operations
120
121 /**
122 * Stores a collection of values with the same key.
123 *
124 * @param key key to store in the multimap
125 * @param values values to store in the multimap
126 * @return {@code true} if the multimap changed
127 */
128 boolean putAll(@Nullable K key, Iterable<? extends V> values);
129
130 /**
131 * Copies all of another multimap's key-value pairs into this multimap. The
132 * order in which the mappings are added is determined by
133 * {@code multimap.entries()}.
134 *
135 * @param multimap mappings to store in this multimap
136 * @return {@code true} if the multimap changed
137 */
138 boolean putAll(Multimap<? extends K, ? extends V> multimap);
139
140 /**
141 * Stores a collection of values with the same key, replacing any existing
142 * values for that key.
143 *
144 * @param key key to store in the multimap
145 * @param values values to store in the multimap
146 * @return the collection of replaced values, or an empty collection if no
147 * values were previously associated with the key. The collection
148 * <i>may</i> be modifiable, but updating it will have no effect on the
149 * multimap.
150 */
151 Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values);
152
153 /**
154 * Removes all values associated with a given key.
155 *
156 * @param key key of entries to remove from the multimap
157 * @return the collection of removed values, or an empty collection if no
158 * values were associated with the provided key. The collection
159 * <i>may</i> be modifiable, but updating it will have no effect on the
160 * multimap.
161 */
162 Collection<V> removeAll(@Nullable Object key);
163
164 /**
165 * Removes all key-value pairs from the multimap.
166 */
167 void clear();
168
169 // Views
170
171 /**
172 * Returns a collection view of all values associated with a key. If no
173 * mappings in the multimap have the provided key, an empty collection is
174 * returned.
175 *
176 * <p>Changes to the returned collection will update the underlying multimap,
177 * and vice versa.
178 *
179 * @param key key to search for in multimap
180 * @return the collection of values that the key maps to
181 */
182 Collection<V> get(@Nullable K key);
183
184 /**
185 * Returns the set of all keys, each appearing once in the returned set.
186 * Changes to the returned set will update the underlying multimap, and vice
187 * versa.
188 *
189 * @return the collection of distinct keys
190 */
191 Set<K> keySet();
192
193 /**
194 * Returns a collection, which may contain duplicates, of all keys. The number
195 * of times of key appears in the returned multiset equals the number of
196 * mappings the key has in the multimap. Changes to the returned multiset will
197 * update the underlying multimap, and vice versa.
198 *
199 * @return a multiset with keys corresponding to the distinct keys of the
200 * multimap and frequencies corresponding to the number of values that
201 * each key maps to
202 */
203 Multiset<K> keys();
204
205 /**
206 * Returns a collection of all values in the multimap. Changes to the returned
207 * collection will update the underlying multimap, and vice versa.
208 *
209 * @return collection of values, which may include the same value multiple
210 * times if it occurs in multiple mappings
211 */
212 Collection<V> values();
213
214 /**
215 * Returns a collection of all key-value pairs. Changes to the returned
216 * collection will update the underlying multimap, and vice versa. The entries
217 * collection does not support the {@code add} or {@code addAll} operations.
218 *
219 * @return collection of map entries consisting of key-value pairs
220 */
221 Collection<Map.Entry<K, V>> entries();
222
223 /**
224 * Returns a map view that associates each key with the corresponding values
225 * in the multimap. Changes to the returned map, such as element removal, will
226 * update the underlying multimap. The map does not support {@code setValue()}
227 * on its entries, {@code put}, or {@code putAll}.
228 *
229 * <p>When passed a key that is present in the map, {@code
230 * asMap().get(Object)} has the same behavior as {@link #get}, returning a
231 * live collection. When passed a key that is not present, however, {@code
232 * asMap().get(Object)} returns {@code null} instead of an empty collection.
233 *
234 * @return a map view from a key to its collection of values
235 */
236 Map<K, Collection<V>> asMap();
237
238 // Comparison and hashing
239
240 /**
241 * Compares the specified object with this multimap for equality. Two
242 * multimaps are equal when their map views, as returned by {@link #asMap},
243 * are also equal.
244 *
245 * <p>In general, two multimaps with identical key-value mappings may or may
246 * not be equal, depending on the implementation. For example, two
247 * {@link SetMultimap} instances with the same key-value mappings are equal,
248 * but equality of two {@link ListMultimap} instances depends on the ordering
249 * of the values for each key.
250 *
251 * <p>A non-empty {@link SetMultimap} cannot be equal to a non-empty
252 * {@link ListMultimap}, since their {@link #asMap} views contain unequal
253 * collections as values. However, any two empty multimaps are equal, because
254 * they both have empty {@link #asMap} views.
255 */
256 @Override
257 boolean equals(@Nullable Object obj);
258
259 /**
260 * Returns the hash code for this multimap.
261 *
262 * <p>The hash code of a multimap is defined as the hash code of the map view,
263 * as returned by {@link Multimap#asMap}.
264 */
265 @Override
266 int hashCode();
267 }