View Javadoc
1   /*
2    * Copyright (C) 2007 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.google.common.collect;
18  
19  import static com.google.common.base.Preconditions.checkArgument;
20  import static com.google.common.base.Preconditions.checkNotNull;
21  import static com.google.common.base.Predicates.compose;
22  import static com.google.common.base.Predicates.equalTo;
23  import static com.google.common.base.Predicates.in;
24  import static com.google.common.base.Predicates.not;
25  import static com.google.common.collect.CollectPreconditions.checkNonnegative;
26  
27  import com.google.common.annotations.Beta;
28  import com.google.common.annotations.GwtCompatible;
29  import com.google.common.annotations.GwtIncompatible;
30  import com.google.common.base.Converter;
31  import com.google.common.base.Equivalence;
32  import com.google.common.base.Function;
33  import com.google.common.base.Joiner.MapJoiner;
34  import com.google.common.base.Objects;
35  import com.google.common.base.Preconditions;
36  import com.google.common.base.Predicate;
37  import com.google.common.base.Predicates;
38  import com.google.common.collect.MapDifference.ValueDifference;
39  import com.google.common.primitives.Ints;
40  
41  import java.io.Serializable;
42  import java.util.AbstractCollection;
43  import java.util.AbstractMap;
44  import java.util.Collection;
45  import java.util.Collections;
46  import java.util.Comparator;
47  import java.util.EnumMap;
48  import java.util.Enumeration;
49  import java.util.HashMap;
50  import java.util.IdentityHashMap;
51  import java.util.Iterator;
52  import java.util.LinkedHashMap;
53  import java.util.Map;
54  import java.util.Map.Entry;
55  import java.util.NavigableMap;
56  import java.util.NavigableSet;
57  import java.util.Properties;
58  import java.util.Set;
59  import java.util.SortedMap;
60  import java.util.SortedSet;
61  import java.util.TreeMap;
62  import java.util.concurrent.ConcurrentMap;
63  
64  import javax.annotation.Nullable;
65  
66  /**
67   * Static utility methods pertaining to {@link Map} instances (including instances of
68   * {@link SortedMap}, {@link BiMap}, etc.). Also see this class's counterparts
69   * {@link Lists}, {@link Sets} and {@link Queues}.
70   *
71   * <p>See the Guava User Guide article on <a href=
72   * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Maps">
73   * {@code Maps}</a>.
74   *
75   * @author Kevin Bourrillion
76   * @author Mike Bostock
77   * @author Isaac Shum
78   * @author Louis Wasserman
79   * @since 2.0 (imported from Google Collections Library)
80   */
81  @GwtCompatible(emulated = true)
82  public final class Maps {
83    private Maps() {}
84  
85    private enum EntryFunction implements Function<Entry<?, ?>, Object> {
86      KEY {
87        @Override
88        @Nullable
89        public Object apply(Entry<?, ?> entry) {
90          return entry.getKey();
91        }
92      },
93      VALUE {
94        @Override
95        @Nullable
96        public Object apply(Entry<?, ?> entry) {
97          return entry.getValue();
98        }
99      };
100   }
101 
102   @SuppressWarnings("unchecked")
103   static <K> Function<Entry<K, ?>, K> keyFunction() {
104     return (Function) EntryFunction.KEY;
105   }
106 
107   @SuppressWarnings("unchecked")
108   static <V> Function<Entry<?, V>, V> valueFunction() {
109     return (Function) EntryFunction.VALUE;
110   }
111 
112   static <K, V> Iterator<K> keyIterator(Iterator<Entry<K, V>> entryIterator) {
113     return Iterators.transform(entryIterator, Maps.<K>keyFunction());
114   }
115 
116   static <K, V> Iterator<V> valueIterator(Iterator<Entry<K, V>> entryIterator) {
117     return Iterators.transform(entryIterator, Maps.<V>valueFunction());
118   }
119 
120   static <K, V> UnmodifiableIterator<V> valueIterator(
121       final UnmodifiableIterator<Entry<K, V>> entryIterator) {
122     return new UnmodifiableIterator<V>() {
123       @Override
124       public boolean hasNext() {
125         return entryIterator.hasNext();
126       }
127 
128       @Override
129       public V next() {
130         return entryIterator.next().getValue();
131       }
132     };
133   }
134 
135   /**
136    * Returns an immutable map instance containing the given entries.
137    * Internally, the returned map will be backed by an {@link EnumMap}.
138    *
139    * <p>The iteration order of the returned map follows the enum's iteration
140    * order, not the order in which the elements appear in the given map.
141    *
142    * @param map the map to make an immutable copy of
143    * @return an immutable map containing those entries
144    * @since 14.0
145    */
146   @GwtCompatible(serializable = true)
147   @Beta
148   public static <K extends Enum<K>, V> ImmutableMap<K, V> immutableEnumMap(
149       Map<K, ? extends V> map) {
150     if (map instanceof ImmutableEnumMap) {
151       @SuppressWarnings("unchecked") // safe covariant cast
152       ImmutableEnumMap<K, V> result = (ImmutableEnumMap<K, V>) map;
153       return result;
154     } else if (map.isEmpty()) {
155       return ImmutableMap.of();
156     } else {
157       for (Map.Entry<K, ? extends V> entry : map.entrySet()) {
158         checkNotNull(entry.getKey());
159         checkNotNull(entry.getValue());
160       }
161       return ImmutableEnumMap.asImmutable(new EnumMap<K, V>(map));
162     }
163   }
164 
165   /**
166    * Creates a <i>mutable</i>, empty {@code HashMap} instance.
167    *
168    * <p><b>Note:</b> if mutability is not required, use {@link
169    * ImmutableMap#of()} instead.
170    *
171    * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link
172    * #newEnumMap} instead.
173    *
174    * @return a new, empty {@code HashMap}
175    */
176   public static <K, V> HashMap<K, V> newHashMap() {
177     return new HashMap<K, V>();
178   }
179 
180   /**
181    * Creates a {@code HashMap} instance, with a high enough "initial capacity"
182    * that it <i>should</i> hold {@code expectedSize} elements without growth.
183    * This behavior cannot be broadly guaranteed, but it is observed to be true
184    * for OpenJDK 1.6. It also can't be guaranteed that the method isn't
185    * inadvertently <i>oversizing</i> the returned map.
186    *
187    * @param expectedSize the number of elements you expect to add to the
188    *        returned map
189    * @return a new, empty {@code HashMap} with enough capacity to hold {@code
190    *         expectedSize} elements without resizing
191    * @throws IllegalArgumentException if {@code expectedSize} is negative
192    */
193   public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(
194       int expectedSize) {
195     return new HashMap<K, V>(capacity(expectedSize));
196   }
197 
198   /**
199    * Returns a capacity that is sufficient to keep the map from being resized as
200    * long as it grows no larger than expectedSize and the load factor is >= its
201    * default (0.75).
202    */
203   static int capacity(int expectedSize) {
204     if (expectedSize < 3) {
205       checkNonnegative(expectedSize, "expectedSize");
206       return expectedSize + 1;
207     }
208     if (expectedSize < Ints.MAX_POWER_OF_TWO) {
209       return expectedSize + expectedSize / 3;
210     }
211     return Integer.MAX_VALUE; // any large value
212   }
213 
214   /**
215    * Creates a <i>mutable</i> {@code HashMap} instance with the same mappings as
216    * the specified map.
217    *
218    * <p><b>Note:</b> if mutability is not required, use {@link
219    * ImmutableMap#copyOf(Map)} instead.
220    *
221    * <p><b>Note:</b> if {@code K} is an {@link Enum} type, use {@link
222    * #newEnumMap} instead.
223    *
224    * @param map the mappings to be placed in the new map
225    * @return a new {@code HashMap} initialized with the mappings from {@code
226    *         map}
227    */
228   public static <K, V> HashMap<K, V> newHashMap(
229       Map<? extends K, ? extends V> map) {
230     return new HashMap<K, V>(map);
231   }
232 
233   /**
234    * Creates a <i>mutable</i>, empty, insertion-ordered {@code LinkedHashMap}
235    * instance.
236    *
237    * <p><b>Note:</b> if mutability is not required, use {@link
238    * ImmutableMap#of()} instead.
239    *
240    * @return a new, empty {@code LinkedHashMap}
241    */
242   public static <K, V> LinkedHashMap<K, V> newLinkedHashMap() {
243     return new LinkedHashMap<K, V>();
244   }
245 
246   /**
247    * Creates a <i>mutable</i>, insertion-ordered {@code LinkedHashMap} instance
248    * with the same mappings as the specified map.
249    *
250    * <p><b>Note:</b> if mutability is not required, use {@link
251    * ImmutableMap#copyOf(Map)} instead.
252    *
253    * @param map the mappings to be placed in the new map
254    * @return a new, {@code LinkedHashMap} initialized with the mappings from
255    *         {@code map}
256    */
257   public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(
258       Map<? extends K, ? extends V> map) {
259     return new LinkedHashMap<K, V>(map);
260   }
261 
262   /**
263    * Returns a general-purpose instance of {@code ConcurrentMap}, which supports
264    * all optional operations of the ConcurrentMap interface. It does not permit
265    * null keys or values. It is serializable.
266    *
267    * <p>This is currently accomplished by calling {@link MapMaker#makeMap()}.
268    *
269    * <p>It is preferable to use {@code MapMaker} directly (rather than through
270    * this method), as it presents numerous useful configuration options,
271    * such as the concurrency level, load factor, key/value reference types,
272    * and value computation.
273    *
274    * @return a new, empty {@code ConcurrentMap}
275    * @since 3.0
276    */
277   public static <K, V> ConcurrentMap<K, V> newConcurrentMap() {
278     return new MapMaker().<K, V>makeMap();
279   }
280 
281   /**
282    * Creates a <i>mutable</i>, empty {@code TreeMap} instance using the natural
283    * ordering of its elements.
284    *
285    * <p><b>Note:</b> if mutability is not required, use {@link
286    * ImmutableSortedMap#of()} instead.
287    *
288    * @return a new, empty {@code TreeMap}
289    */
290   public static <K extends Comparable, V> TreeMap<K, V> newTreeMap() {
291     return new TreeMap<K, V>();
292   }
293 
294   /**
295    * Creates a <i>mutable</i> {@code TreeMap} instance with the same mappings as
296    * the specified map and using the same ordering as the specified map.
297    *
298    * <p><b>Note:</b> if mutability is not required, use {@link
299    * ImmutableSortedMap#copyOfSorted(SortedMap)} instead.
300    *
301    * @param map the sorted map whose mappings are to be placed in the new map
302    *        and whose comparator is to be used to sort the new map
303    * @return a new {@code TreeMap} initialized with the mappings from {@code
304    *         map} and using the comparator of {@code map}
305    */
306   public static <K, V> TreeMap<K, V> newTreeMap(SortedMap<K, ? extends V> map) {
307     return new TreeMap<K, V>(map);
308   }
309 
310   /**
311    * Creates a <i>mutable</i>, empty {@code TreeMap} instance using the given
312    * comparator.
313    *
314    * <p><b>Note:</b> if mutability is not required, use {@code
315    * ImmutableSortedMap.orderedBy(comparator).build()} instead.
316    *
317    * @param comparator the comparator to sort the keys with
318    * @return a new, empty {@code TreeMap}
319    */
320   public static <C, K extends C, V> TreeMap<K, V> newTreeMap(
321       @Nullable Comparator<C> comparator) {
322     // Ideally, the extra type parameter "C" shouldn't be necessary. It is a
323     // work-around of a compiler type inference quirk that prevents the
324     // following code from being compiled:
325     // Comparator<Class<?>> comparator = null;
326     // Map<Class<? extends Throwable>, String> map = newTreeMap(comparator);
327     return new TreeMap<K, V>(comparator);
328   }
329 
330   /**
331    * Creates an {@code EnumMap} instance.
332    *
333    * @param type the key type for this map
334    * @return a new, empty {@code EnumMap}
335    */
336   public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(Class<K> type) {
337     return new EnumMap<K, V>(checkNotNull(type));
338   }
339 
340   /**
341    * Creates an {@code EnumMap} with the same mappings as the specified map.
342    *
343    * @param map the map from which to initialize this {@code EnumMap}
344    * @return a new {@code EnumMap} initialized with the mappings from {@code
345    *         map}
346    * @throws IllegalArgumentException if {@code m} is not an {@code EnumMap}
347    *         instance and contains no mappings
348    */
349   public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(
350       Map<K, ? extends V> map) {
351     return new EnumMap<K, V>(map);
352   }
353 
354   /**
355    * Creates an {@code IdentityHashMap} instance.
356    *
357    * @return a new, empty {@code IdentityHashMap}
358    */
359   public static <K, V> IdentityHashMap<K, V> newIdentityHashMap() {
360     return new IdentityHashMap<K, V>();
361   }
362 
363   /**
364    * Computes the difference between two maps. This difference is an immutable
365    * snapshot of the state of the maps at the time this method is called. It
366    * will never change, even if the maps change at a later time.
367    *
368    * <p>Since this method uses {@code HashMap} instances internally, the keys of
369    * the supplied maps must be well-behaved with respect to
370    * {@link Object#equals} and {@link Object#hashCode}.
371    *
372    * <p><b>Note:</b>If you only need to know whether two maps have the same
373    * mappings, call {@code left.equals(right)} instead of this method.
374    *
375    * @param left the map to treat as the "left" map for purposes of comparison
376    * @param right the map to treat as the "right" map for purposes of comparison
377    * @return the difference between the two maps
378    */
379   @SuppressWarnings("unchecked")
380   public static <K, V> MapDifference<K, V> difference(
381       Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
382     if (left instanceof SortedMap) {
383       SortedMap<K, ? extends V> sortedLeft = (SortedMap<K, ? extends V>) left;
384       SortedMapDifference<K, V> result = difference(sortedLeft, right);
385       return result;
386     }
387     return difference(left, right, Equivalence.equals());
388   }
389 
390   /**
391    * Computes the difference between two maps. This difference is an immutable
392    * snapshot of the state of the maps at the time this method is called. It
393    * will never change, even if the maps change at a later time.
394    *
395    * <p>Values are compared using a provided equivalence, in the case of
396    * equality, the value on the 'left' is returned in the difference.
397    *
398    * <p>Since this method uses {@code HashMap} instances internally, the keys of
399    * the supplied maps must be well-behaved with respect to
400    * {@link Object#equals} and {@link Object#hashCode}.
401    *
402    * @param left the map to treat as the "left" map for purposes of comparison
403    * @param right the map to treat as the "right" map for purposes of comparison
404    * @param valueEquivalence the equivalence relationship to use to compare
405    *    values
406    * @return the difference between the two maps
407    * @since 10.0
408    */
409   @Beta
410   public static <K, V> MapDifference<K, V> difference(
411       Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right,
412       Equivalence<? super V> valueEquivalence) {
413     Preconditions.checkNotNull(valueEquivalence);
414 
415     Map<K, V> onlyOnLeft = newHashMap();
416     Map<K, V> onlyOnRight = new HashMap<K, V>(right); // will whittle it down
417     Map<K, V> onBoth = newHashMap();
418     Map<K, MapDifference.ValueDifference<V>> differences = newHashMap();
419     doDifference(left, right, valueEquivalence, onlyOnLeft, onlyOnRight, onBoth, differences);
420     return new MapDifferenceImpl<K, V>(onlyOnLeft, onlyOnRight, onBoth, differences);
421   }
422 
423   private static <K, V> void doDifference(
424       Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right,
425       Equivalence<? super V> valueEquivalence,
426       Map<K, V> onlyOnLeft, Map<K, V> onlyOnRight, Map<K, V> onBoth,
427       Map<K, MapDifference.ValueDifference<V>> differences) {
428     for (Entry<? extends K, ? extends V> entry : left.entrySet()) {
429       K leftKey = entry.getKey();
430       V leftValue = entry.getValue();
431       if (right.containsKey(leftKey)) {
432         V rightValue = onlyOnRight.remove(leftKey);
433         if (valueEquivalence.equivalent(leftValue, rightValue)) {
434           onBoth.put(leftKey, leftValue);
435         } else {
436           differences.put(
437               leftKey, ValueDifferenceImpl.create(leftValue, rightValue));
438         }
439       } else {
440         onlyOnLeft.put(leftKey, leftValue);
441       }
442     }
443   }
444 
445   private static <K, V> Map<K, V> unmodifiableMap(Map<K, V> map) {
446     if (map instanceof SortedMap) {
447       return Collections.unmodifiableSortedMap((SortedMap<K, ? extends V>) map);
448     } else {
449       return Collections.unmodifiableMap(map);
450     }
451   }
452 
453   static class MapDifferenceImpl<K, V> implements MapDifference<K, V> {
454     final Map<K, V> onlyOnLeft;
455     final Map<K, V> onlyOnRight;
456     final Map<K, V> onBoth;
457     final Map<K, ValueDifference<V>> differences;
458 
459     MapDifferenceImpl(Map<K, V> onlyOnLeft,
460         Map<K, V> onlyOnRight, Map<K, V> onBoth,
461         Map<K, ValueDifference<V>> differences) {
462       this.onlyOnLeft = unmodifiableMap(onlyOnLeft);
463       this.onlyOnRight = unmodifiableMap(onlyOnRight);
464       this.onBoth = unmodifiableMap(onBoth);
465       this.differences = unmodifiableMap(differences);
466     }
467 
468     @Override
469     public boolean areEqual() {
470       return onlyOnLeft.isEmpty() && onlyOnRight.isEmpty() && differences.isEmpty();
471     }
472 
473     @Override
474     public Map<K, V> entriesOnlyOnLeft() {
475       return onlyOnLeft;
476     }
477 
478     @Override
479     public Map<K, V> entriesOnlyOnRight() {
480       return onlyOnRight;
481     }
482 
483     @Override
484     public Map<K, V> entriesInCommon() {
485       return onBoth;
486     }
487 
488     @Override
489     public Map<K, ValueDifference<V>> entriesDiffering() {
490       return differences;
491     }
492 
493     @Override public boolean equals(Object object) {
494       if (object == this) {
495         return true;
496       }
497       if (object instanceof MapDifference) {
498         MapDifference<?, ?> other = (MapDifference<?, ?>) object;
499         return entriesOnlyOnLeft().equals(other.entriesOnlyOnLeft())
500             && entriesOnlyOnRight().equals(other.entriesOnlyOnRight())
501             && entriesInCommon().equals(other.entriesInCommon())
502             && entriesDiffering().equals(other.entriesDiffering());
503       }
504       return false;
505     }
506 
507     @Override public int hashCode() {
508       return Objects.hashCode(entriesOnlyOnLeft(), entriesOnlyOnRight(),
509           entriesInCommon(), entriesDiffering());
510     }
511 
512     @Override public String toString() {
513       if (areEqual()) {
514         return "equal";
515       }
516 
517       StringBuilder result = new StringBuilder("not equal");
518       if (!onlyOnLeft.isEmpty()) {
519         result.append(": only on left=").append(onlyOnLeft);
520       }
521       if (!onlyOnRight.isEmpty()) {
522         result.append(": only on right=").append(onlyOnRight);
523       }
524       if (!differences.isEmpty()) {
525         result.append(": value differences=").append(differences);
526       }
527       return result.toString();
528     }
529   }
530 
531   static class ValueDifferenceImpl<V>
532       implements MapDifference.ValueDifference<V> {
533     private final V left;
534     private final V right;
535 
536     static <V> ValueDifference<V> create(@Nullable V left, @Nullable V right) {
537       return new ValueDifferenceImpl<V>(left, right);
538     }
539 
540     private ValueDifferenceImpl(@Nullable V left, @Nullable V right) {
541       this.left = left;
542       this.right = right;
543     }
544 
545     @Override
546     public V leftValue() {
547       return left;
548     }
549 
550     @Override
551     public V rightValue() {
552       return right;
553     }
554 
555     @Override public boolean equals(@Nullable Object object) {
556       if (object instanceof MapDifference.ValueDifference) {
557         MapDifference.ValueDifference<?> that =
558             (MapDifference.ValueDifference<?>) object;
559         return Objects.equal(this.left, that.leftValue())
560             && Objects.equal(this.right, that.rightValue());
561       }
562       return false;
563     }
564 
565     @Override public int hashCode() {
566       return Objects.hashCode(left, right);
567     }
568 
569     @Override public String toString() {
570       return "(" + left + ", " + right + ")";
571     }
572   }
573 
574   /**
575    * Computes the difference between two sorted maps, using the comparator of
576    * the left map, or {@code Ordering.natural()} if the left map uses the
577    * natural ordering of its elements. This difference is an immutable snapshot
578    * of the state of the maps at the time this method is called. It will never
579    * change, even if the maps change at a later time.
580    *
581    * <p>Since this method uses {@code TreeMap} instances internally, the keys of
582    * the right map must all compare as distinct according to the comparator
583    * of the left map.
584    *
585    * <p><b>Note:</b>If you only need to know whether two sorted maps have the
586    * same mappings, call {@code left.equals(right)} instead of this method.
587    *
588    * @param left the map to treat as the "left" map for purposes of comparison
589    * @param right the map to treat as the "right" map for purposes of comparison
590    * @return the difference between the two maps
591    * @since 11.0
592    */
593   public static <K, V> SortedMapDifference<K, V> difference(
594       SortedMap<K, ? extends V> left, Map<? extends K, ? extends V> right) {
595     checkNotNull(left);
596     checkNotNull(right);
597     Comparator<? super K> comparator = orNaturalOrder(left.comparator());
598     SortedMap<K, V> onlyOnLeft = Maps.newTreeMap(comparator);
599     SortedMap<K, V> onlyOnRight = Maps.newTreeMap(comparator);
600     onlyOnRight.putAll(right); // will whittle it down
601     SortedMap<K, V> onBoth = Maps.newTreeMap(comparator);
602     SortedMap<K, MapDifference.ValueDifference<V>> differences =
603         Maps.newTreeMap(comparator);
604     doDifference(left, right, Equivalence.equals(), onlyOnLeft, onlyOnRight, onBoth, differences);
605     return new SortedMapDifferenceImpl<K, V>(onlyOnLeft, onlyOnRight, onBoth, differences);
606   }
607 
608   static class SortedMapDifferenceImpl<K, V> extends MapDifferenceImpl<K, V>
609       implements SortedMapDifference<K, V> {
610     SortedMapDifferenceImpl(SortedMap<K, V> onlyOnLeft,
611         SortedMap<K, V> onlyOnRight, SortedMap<K, V> onBoth,
612         SortedMap<K, ValueDifference<V>> differences) {
613       super(onlyOnLeft, onlyOnRight, onBoth, differences);
614     }
615 
616     @Override public SortedMap<K, ValueDifference<V>> entriesDiffering() {
617       return (SortedMap<K, ValueDifference<V>>) super.entriesDiffering();
618     }
619 
620     @Override public SortedMap<K, V> entriesInCommon() {
621       return (SortedMap<K, V>) super.entriesInCommon();
622     }
623 
624     @Override public SortedMap<K, V> entriesOnlyOnLeft() {
625       return (SortedMap<K, V>) super.entriesOnlyOnLeft();
626     }
627 
628     @Override public SortedMap<K, V> entriesOnlyOnRight() {
629       return (SortedMap<K, V>) super.entriesOnlyOnRight();
630     }
631   }
632 
633   /**
634    * Returns the specified comparator if not null; otherwise returns {@code
635    * Ordering.natural()}. This method is an abomination of generics; the only
636    * purpose of this method is to contain the ugly type-casting in one place.
637    */
638   @SuppressWarnings("unchecked")
639   static <E> Comparator<? super E> orNaturalOrder(
640       @Nullable Comparator<? super E> comparator) {
641     if (comparator != null) { // can't use ? : because of javac bug 5080917
642       return comparator;
643     }
644     return (Comparator<E>) Ordering.natural();
645   }
646 
647   /**
648    * Returns a live {@link Map} view whose keys are the contents of {@code set}
649    * and whose values are computed on demand using {@code function}. To get an
650    * immutable <i>copy</i> instead, use {@link #toMap(Iterable, Function)}.
651    *
652    * <p>Specifically, for each {@code k} in the backing set, the returned map
653    * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code
654    * keySet}, {@code values}, and {@code entrySet} views of the returned map
655    * iterate in the same order as the backing set.
656    *
657    * <p>Modifications to the backing set are read through to the returned map.
658    * The returned map supports removal operations if the backing set does.
659    * Removal operations write through to the backing set.  The returned map
660    * does not support put operations.
661    *
662    * <p><b>Warning:</b> If the function rejects {@code null}, caution is
663    * required to make sure the set does not contain {@code null}, because the
664    * view cannot stop {@code null} from being added to the set.
665    *
666    * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
667    * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also
668    * of type {@code K}. Using a key type for which this may not hold, such as
669    * {@code ArrayList}, may risk a {@code ClassCastException} when calling
670    * methods on the resulting map view.
671    *
672    * @since 14.0
673    */
674   @Beta
675   public static <K, V> Map<K, V> asMap(
676       Set<K> set, Function<? super K, V> function) {
677     if (set instanceof SortedSet) {
678       return asMap((SortedSet<K>) set, function);
679     } else {
680       return new AsMapView<K, V>(set, function);
681     }
682   }
683 
684   /**
685    * Returns a view of the sorted set as a map, mapping keys from the set
686    * according to the specified function.
687    *
688    * <p>Specifically, for each {@code k} in the backing set, the returned map
689    * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code
690    * keySet}, {@code values}, and {@code entrySet} views of the returned map
691    * iterate in the same order as the backing set.
692    *
693    * <p>Modifications to the backing set are read through to the returned map.
694    * The returned map supports removal operations if the backing set does.
695    * Removal operations write through to the backing set.  The returned map does
696    * not support put operations.
697    *
698    * <p><b>Warning:</b> If the function rejects {@code null}, caution is
699    * required to make sure the set does not contain {@code null}, because the
700    * view cannot stop {@code null} from being added to the set.
701    *
702    * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
703    * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also of
704    * type {@code K}. Using a key type for which this may not hold, such as
705    * {@code ArrayList}, may risk a {@code ClassCastException} when calling
706    * methods on the resulting map view.
707    *
708    * @since 14.0
709    */
710   @Beta
711   public static <K, V> SortedMap<K, V> asMap(
712       SortedSet<K> set, Function<? super K, V> function) {
713     return Platform.mapsAsMapSortedSet(set, function);
714   }
715 
716   static <K, V> SortedMap<K, V> asMapSortedIgnoreNavigable(SortedSet<K> set,
717       Function<? super K, V> function) {
718     return new SortedAsMapView<K, V>(set, function);
719   }
720 
721   /**
722    * Returns a view of the navigable set as a map, mapping keys from the set
723    * according to the specified function.
724    *
725    * <p>Specifically, for each {@code k} in the backing set, the returned map
726    * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code
727    * keySet}, {@code values}, and {@code entrySet} views of the returned map
728    * iterate in the same order as the backing set.
729    *
730    * <p>Modifications to the backing set are read through to the returned map.
731    * The returned map supports removal operations if the backing set does.
732    * Removal operations write through to the backing set.  The returned map
733    * does not support put operations.
734    *
735    * <p><b>Warning:</b> If the function rejects {@code null}, caution is
736    * required to make sure the set does not contain {@code null}, because the
737    * view cannot stop {@code null} from being added to the set.
738    *
739    * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
740    * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also
741    * of type {@code K}. Using a key type for which this may not hold, such as
742    * {@code ArrayList}, may risk a {@code ClassCastException} when calling
743    * methods on the resulting map view.
744    *
745    * @since 14.0
746    */
747   @Beta
748   @GwtIncompatible("NavigableMap")
749   public static <K, V> NavigableMap<K, V> asMap(
750       NavigableSet<K> set, Function<? super K, V> function) {
751     return new NavigableAsMapView<K, V>(set, function);
752   }
753 
754   private static class AsMapView<K, V> extends ImprovedAbstractMap<K, V> {
755 
756     private final Set<K> set;
757     final Function<? super K, V> function;
758 
759     Set<K> backingSet() {
760       return set;
761     }
762 
763     AsMapView(Set<K> set, Function<? super K, V> function) {
764       this.set = checkNotNull(set);
765       this.function = checkNotNull(function);
766     }
767 
768     @Override
769     public Set<K> createKeySet() {
770       return removeOnlySet(backingSet());
771     }
772 
773     @Override
774     Collection<V> createValues() {
775       return Collections2.transform(set, function);
776     }
777 
778     @Override
779     public int size() {
780       return backingSet().size();
781     }
782 
783     @Override
784     public boolean containsKey(@Nullable Object key) {
785       return backingSet().contains(key);
786     }
787 
788     @Override
789     public V get(@Nullable Object key) {
790       if (Collections2.safeContains(backingSet(), key)) {
791         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
792         K k = (K) key;
793         return function.apply(k);
794       } else {
795         return null;
796       }
797     }
798 
799     @Override
800     public V remove(@Nullable Object key) {
801       if (backingSet().remove(key)) {
802         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
803         K k = (K) key;
804         return function.apply(k);
805       } else {
806         return null;
807       }
808     }
809 
810     @Override
811     public void clear() {
812       backingSet().clear();
813     }
814 
815     @Override
816     protected Set<Entry<K, V>> createEntrySet() {
817       return new EntrySet<K, V>() {
818         @Override
819         Map<K, V> map() {
820           return AsMapView.this;
821         }
822 
823         @Override
824         public Iterator<Entry<K, V>> iterator() {
825           return asMapEntryIterator(backingSet(), function);
826         }
827       };
828     }
829   }
830 
831   static <K, V> Iterator<Entry<K, V>> asMapEntryIterator(
832       Set<K> set, final Function<? super K, V> function) {
833     return new TransformedIterator<K, Entry<K,V>>(set.iterator()) {
834       @Override
835       Entry<K, V> transform(final K key) {
836         return immutableEntry(key, function.apply(key));
837       }
838     };
839   }
840 
841   private static class SortedAsMapView<K, V> extends AsMapView<K, V>
842       implements SortedMap<K, V> {
843 
844     SortedAsMapView(SortedSet<K> set, Function<? super K, V> function) {
845       super(set, function);
846     }
847 
848     @Override
849     SortedSet<K> backingSet() {
850       return (SortedSet<K>) super.backingSet();
851     }
852 
853     @Override
854     public Comparator<? super K> comparator() {
855       return backingSet().comparator();
856     }
857 
858     @Override
859     public Set<K> keySet() {
860       return removeOnlySortedSet(backingSet());
861     }
862 
863     @Override
864     public SortedMap<K, V> subMap(K fromKey, K toKey) {
865       return asMap(backingSet().subSet(fromKey, toKey), function);
866     }
867 
868     @Override
869     public SortedMap<K, V> headMap(K toKey) {
870       return asMap(backingSet().headSet(toKey), function);
871     }
872 
873     @Override
874     public SortedMap<K, V> tailMap(K fromKey) {
875       return asMap(backingSet().tailSet(fromKey), function);
876     }
877 
878     @Override
879     public K firstKey() {
880       return backingSet().first();
881     }
882 
883     @Override
884     public K lastKey() {
885       return backingSet().last();
886     }
887   }
888 
889   @GwtIncompatible("NavigableMap")
890   private static final class NavigableAsMapView<K, V>
891       extends AbstractNavigableMap<K, V> {
892     /*
893      * Using AbstractNavigableMap is simpler than extending SortedAsMapView and rewriting all the
894      * NavigableMap methods.
895      */
896 
897     private final NavigableSet<K> set;
898     private final Function<? super K, V> function;
899 
900     NavigableAsMapView(NavigableSet<K> ks, Function<? super K, V> vFunction) {
901       this.set = checkNotNull(ks);
902       this.function = checkNotNull(vFunction);
903     }
904 
905     @Override
906     public NavigableMap<K, V> subMap(
907         K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
908       return asMap(set.subSet(fromKey, fromInclusive, toKey, toInclusive), function);
909     }
910 
911     @Override
912     public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
913       return asMap(set.headSet(toKey, inclusive), function);
914     }
915 
916     @Override
917     public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
918       return asMap(set.tailSet(fromKey, inclusive), function);
919     }
920 
921     @Override
922     public Comparator<? super K> comparator() {
923       return set.comparator();
924     }
925 
926     @Override
927     @Nullable
928     public V get(@Nullable Object key) {
929       if (Collections2.safeContains(set, key)) {
930         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
931         K k = (K) key;
932         return function.apply(k);
933       } else {
934         return null;
935       }
936     }
937 
938     @Override
939     public void clear() {
940       set.clear();
941     }
942 
943     @Override
944     Iterator<Entry<K, V>> entryIterator() {
945       return asMapEntryIterator(set, function);
946     }
947 
948     @Override
949     Iterator<Entry<K, V>> descendingEntryIterator() {
950       return descendingMap().entrySet().iterator();
951     }
952 
953     @Override
954     public NavigableSet<K> navigableKeySet() {
955       return removeOnlyNavigableSet(set);
956     }
957 
958     @Override
959     public int size() {
960       return set.size();
961     }
962 
963     @Override
964     public NavigableMap<K, V> descendingMap() {
965       return asMap(set.descendingSet(), function);
966     }
967   }
968 
969   private static <E> Set<E> removeOnlySet(final Set<E> set) {
970     return new ForwardingSet<E>() {
971       @Override
972       protected Set<E> delegate() {
973         return set;
974       }
975 
976       @Override
977       public boolean add(E element) {
978         throw new UnsupportedOperationException();
979       }
980 
981       @Override
982       public boolean addAll(Collection<? extends E> es) {
983         throw new UnsupportedOperationException();
984       }
985     };
986   }
987 
988   private static <E> SortedSet<E> removeOnlySortedSet(final SortedSet<E> set) {
989     return new ForwardingSortedSet<E>() {
990       @Override
991       protected SortedSet<E> delegate() {
992         return set;
993       }
994 
995       @Override
996       public boolean add(E element) {
997         throw new UnsupportedOperationException();
998       }
999 
1000       @Override
1001       public boolean addAll(Collection<? extends E> es) {
1002         throw new UnsupportedOperationException();
1003       }
1004 
1005       @Override
1006       public SortedSet<E> headSet(E toElement) {
1007         return removeOnlySortedSet(super.headSet(toElement));
1008       }
1009 
1010       @Override
1011       public SortedSet<E> subSet(E fromElement, E toElement) {
1012         return removeOnlySortedSet(super.subSet(fromElement, toElement));
1013       }
1014 
1015       @Override
1016       public SortedSet<E> tailSet(E fromElement) {
1017         return removeOnlySortedSet(super.tailSet(fromElement));
1018       }
1019     };
1020   }
1021 
1022   @GwtIncompatible("NavigableSet")
1023   private static <E> NavigableSet<E> removeOnlyNavigableSet(final NavigableSet<E> set) {
1024     return new ForwardingNavigableSet<E>() {
1025       @Override
1026       protected NavigableSet<E> delegate() {
1027         return set;
1028       }
1029 
1030       @Override
1031       public boolean add(E element) {
1032         throw new UnsupportedOperationException();
1033       }
1034 
1035       @Override
1036       public boolean addAll(Collection<? extends E> es) {
1037         throw new UnsupportedOperationException();
1038       }
1039 
1040       @Override
1041       public SortedSet<E> headSet(E toElement) {
1042         return removeOnlySortedSet(super.headSet(toElement));
1043       }
1044 
1045       @Override
1046       public SortedSet<E> subSet(E fromElement, E toElement) {
1047         return removeOnlySortedSet(
1048             super.subSet(fromElement, toElement));
1049       }
1050 
1051       @Override
1052       public SortedSet<E> tailSet(E fromElement) {
1053         return removeOnlySortedSet(super.tailSet(fromElement));
1054       }
1055 
1056       @Override
1057       public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1058         return removeOnlyNavigableSet(super.headSet(toElement, inclusive));
1059       }
1060 
1061       @Override
1062       public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1063         return removeOnlyNavigableSet(super.tailSet(fromElement, inclusive));
1064       }
1065 
1066       @Override
1067       public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
1068           E toElement, boolean toInclusive) {
1069         return removeOnlyNavigableSet(super.subSet(
1070             fromElement, fromInclusive, toElement, toInclusive));
1071       }
1072 
1073       @Override
1074       public NavigableSet<E> descendingSet() {
1075         return removeOnlyNavigableSet(super.descendingSet());
1076       }
1077     };
1078   }
1079 
1080   /**
1081    * Returns an immutable map whose keys are the distinct elements of {@code
1082    * keys} and whose value for each key was computed by {@code valueFunction}.
1083    * The map's iteration order is the order of the first appearance of each key
1084    * in {@code keys}.
1085    *
1086    * <p>If {@code keys} is a {@link Set}, a live view can be obtained instead of
1087    * a copy using {@link Maps#asMap(Set, Function)}.
1088    *
1089    * @throws NullPointerException if any element of {@code keys} is
1090    *     {@code null}, or if {@code valueFunction} produces {@code null}
1091    *     for any key
1092    * @since 14.0
1093    */
1094   @Beta
1095   public static <K, V> ImmutableMap<K, V> toMap(Iterable<K> keys,
1096       Function<? super K, V> valueFunction) {
1097     return toMap(keys.iterator(), valueFunction);
1098   }
1099 
1100   /**
1101    * Returns an immutable map whose keys are the distinct elements of {@code
1102    * keys} and whose value for each key was computed by {@code valueFunction}.
1103    * The map's iteration order is the order of the first appearance of each key
1104    * in {@code keys}.
1105    *
1106    * @throws NullPointerException if any element of {@code keys} is
1107    *     {@code null}, or if {@code valueFunction} produces {@code null}
1108    *     for any key
1109    * @since 14.0
1110    */
1111   @Beta
1112   public static <K, V> ImmutableMap<K, V> toMap(Iterator<K> keys,
1113       Function<? super K, V> valueFunction) {
1114     checkNotNull(valueFunction);
1115     // Using LHM instead of a builder so as not to fail on duplicate keys
1116     Map<K, V> builder = newLinkedHashMap();
1117     while (keys.hasNext()) {
1118       K key = keys.next();
1119       builder.put(key, valueFunction.apply(key));
1120     }
1121     return ImmutableMap.copyOf(builder);
1122   }
1123 
1124   /**
1125    * Returns an immutable map for which the {@link Map#values} are the given
1126    * elements in the given order, and each key is the product of invoking a
1127    * supplied function on its corresponding value.
1128    *
1129    * @param values the values to use when constructing the {@code Map}
1130    * @param keyFunction the function used to produce the key for each value
1131    * @return a map mapping the result of evaluating the function {@code
1132    *         keyFunction} on each value in the input collection to that value
1133    * @throws IllegalArgumentException if {@code keyFunction} produces the same
1134    *         key for more than one value in the input collection
1135    * @throws NullPointerException if any elements of {@code values} is null, or
1136    *         if {@code keyFunction} produces {@code null} for any value
1137    */
1138   public static <K, V> ImmutableMap<K, V> uniqueIndex(
1139       Iterable<V> values, Function<? super V, K> keyFunction) {
1140     return uniqueIndex(values.iterator(), keyFunction);
1141   }
1142 
1143   /**
1144    * Returns an immutable map for which the {@link Map#values} are the given
1145    * elements in the given order, and each key is the product of invoking a
1146    * supplied function on its corresponding value.
1147    *
1148    * @param values the values to use when constructing the {@code Map}
1149    * @param keyFunction the function used to produce the key for each value
1150    * @return a map mapping the result of evaluating the function {@code
1151    *         keyFunction} on each value in the input collection to that value
1152    * @throws IllegalArgumentException if {@code keyFunction} produces the same
1153    *         key for more than one value in the input collection
1154    * @throws NullPointerException if any elements of {@code values} is null, or
1155    *         if {@code keyFunction} produces {@code null} for any value
1156    * @since 10.0
1157    */
1158   public static <K, V> ImmutableMap<K, V> uniqueIndex(
1159       Iterator<V> values, Function<? super V, K> keyFunction) {
1160     checkNotNull(keyFunction);
1161     ImmutableMap.Builder<K, V> builder = ImmutableMap.builder();
1162     while (values.hasNext()) {
1163       V value = values.next();
1164       builder.put(keyFunction.apply(value), value);
1165     }
1166     return builder.build();
1167   }
1168 
1169   /**
1170    * Creates an {@code ImmutableMap<String, String>} from a {@code Properties}
1171    * instance. Properties normally derive from {@code Map<Object, Object>}, but
1172    * they typically contain strings, which is awkward. This method lets you get
1173    * a plain-old-{@code Map} out of a {@code Properties}.
1174    *
1175    * @param properties a {@code Properties} object to be converted
1176    * @return an immutable map containing all the entries in {@code properties}
1177    * @throws ClassCastException if any key in {@code Properties} is not a {@code
1178    *         String}
1179    * @throws NullPointerException if any key or value in {@code Properties} is
1180    *         null
1181    */
1182   @GwtIncompatible("java.util.Properties")
1183   public static ImmutableMap<String, String> fromProperties(
1184       Properties properties) {
1185     ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
1186 
1187     for (Enumeration<?> e = properties.propertyNames(); e.hasMoreElements();) {
1188       String key = (String) e.nextElement();
1189       builder.put(key, properties.getProperty(key));
1190     }
1191 
1192     return builder.build();
1193   }
1194 
1195   /**
1196    * Returns an immutable map entry with the specified key and value. The {@link
1197    * Entry#setValue} operation throws an {@link UnsupportedOperationException}.
1198    *
1199    * <p>The returned entry is serializable.
1200    *
1201    * @param key the key to be associated with the returned entry
1202    * @param value the value to be associated with the returned entry
1203    */
1204   @GwtCompatible(serializable = true)
1205   public static <K, V> Entry<K, V> immutableEntry(
1206       @Nullable K key, @Nullable V value) {
1207     return new ImmutableEntry<K, V>(key, value);
1208   }
1209 
1210   /**
1211    * Returns an unmodifiable view of the specified set of entries. The {@link
1212    * Entry#setValue} operation throws an {@link UnsupportedOperationException},
1213    * as do any operations that would modify the returned set.
1214    *
1215    * @param entrySet the entries for which to return an unmodifiable view
1216    * @return an unmodifiable view of the entries
1217    */
1218   static <K, V> Set<Entry<K, V>> unmodifiableEntrySet(
1219       Set<Entry<K, V>> entrySet) {
1220     return new UnmodifiableEntrySet<K, V>(
1221         Collections.unmodifiableSet(entrySet));
1222   }
1223 
1224   /**
1225    * Returns an unmodifiable view of the specified map entry. The {@link
1226    * Entry#setValue} operation throws an {@link UnsupportedOperationException}.
1227    * This also has the side-effect of redefining {@code equals} to comply with
1228    * the Entry contract, to avoid a possible nefarious implementation of equals.
1229    *
1230    * @param entry the entry for which to return an unmodifiable view
1231    * @return an unmodifiable view of the entry
1232    */
1233   static <K, V> Entry<K, V> unmodifiableEntry(final Entry<? extends K, ? extends V> entry) {
1234     checkNotNull(entry);
1235     return new AbstractMapEntry<K, V>() {
1236       @Override public K getKey() {
1237         return entry.getKey();
1238       }
1239 
1240       @Override public V getValue() {
1241         return entry.getValue();
1242       }
1243     };
1244   }
1245 
1246   /** @see Multimaps#unmodifiableEntries */
1247   static class UnmodifiableEntries<K, V>
1248       extends ForwardingCollection<Entry<K, V>> {
1249     private final Collection<Entry<K, V>> entries;
1250 
1251     UnmodifiableEntries(Collection<Entry<K, V>> entries) {
1252       this.entries = entries;
1253     }
1254 
1255     @Override protected Collection<Entry<K, V>> delegate() {
1256       return entries;
1257     }
1258 
1259     @Override public Iterator<Entry<K, V>> iterator() {
1260       final Iterator<Entry<K, V>> delegate = super.iterator();
1261       return new UnmodifiableIterator<Entry<K, V>>() {
1262         @Override
1263         public boolean hasNext() {
1264           return delegate.hasNext();
1265         }
1266 
1267         @Override public Entry<K, V> next() {
1268           return unmodifiableEntry(delegate.next());
1269         }
1270       };
1271     }
1272 
1273     // See java.util.Collections.UnmodifiableEntrySet for details on attacks.
1274 
1275     @Override public Object[] toArray() {
1276       return standardToArray();
1277     }
1278 
1279     @Override public <T> T[] toArray(T[] array) {
1280       return standardToArray(array);
1281     }
1282   }
1283 
1284   /** @see Maps#unmodifiableEntrySet(Set) */
1285   static class UnmodifiableEntrySet<K, V>
1286       extends UnmodifiableEntries<K, V> implements Set<Entry<K, V>> {
1287     UnmodifiableEntrySet(Set<Entry<K, V>> entries) {
1288       super(entries);
1289     }
1290 
1291     // See java.util.Collections.UnmodifiableEntrySet for details on attacks.
1292 
1293     @Override public boolean equals(@Nullable Object object) {
1294       return Sets.equalsImpl(this, object);
1295     }
1296 
1297     @Override public int hashCode() {
1298       return Sets.hashCodeImpl(this);
1299     }
1300   }
1301 
1302   /**
1303    * Returns a {@link Converter} that converts values using {@link BiMap#get bimap.get()},
1304    * and whose inverse view converts values using
1305    * {@link BiMap#inverse bimap.inverse()}{@code .get()}.
1306    *
1307    * <p>To use a plain {@link Map} as a {@link Function}, see
1308    * {@link com.google.common.base.Functions#forMap(Map)} or
1309    * {@link com.google.common.base.Functions#forMap(Map, Object)}.
1310    *
1311    * @since 16.0
1312    */
1313   @Beta
1314   public static <A, B> Converter<A, B> asConverter(final BiMap<A, B> bimap) {
1315     return new BiMapConverter<A, B>(bimap);
1316   }
1317 
1318   private static final class BiMapConverter<A, B> extends Converter<A, B> implements Serializable {
1319     private final BiMap<A, B> bimap;
1320 
1321     BiMapConverter(BiMap<A, B> bimap) {
1322       this.bimap = checkNotNull(bimap);
1323     }
1324 
1325     @Override
1326     protected B doForward(A a) {
1327       return convert(bimap, a);
1328     }
1329 
1330     @Override
1331     protected A doBackward(B b) {
1332       return convert(bimap.inverse(), b);
1333     }
1334 
1335     private static <X, Y> Y convert(BiMap<X, Y> bimap, X input) {
1336       Y output = bimap.get(input);
1337       checkArgument(output != null, "No non-null mapping present for input: %s", input);
1338       return output;
1339     }
1340 
1341     @Override
1342     public boolean equals(@Nullable Object object) {
1343       if (object instanceof BiMapConverter) {
1344         BiMapConverter<?, ?> that = (BiMapConverter<?, ?>) object;
1345         return this.bimap.equals(that.bimap);
1346       }
1347       return false;
1348     }
1349 
1350     @Override
1351     public int hashCode() {
1352       return bimap.hashCode();
1353     }
1354 
1355     // There's really no good way to implement toString() without printing the entire BiMap, right?
1356     @Override
1357     public String toString() {
1358       return "Maps.asConverter(" + bimap + ")";
1359     }
1360 
1361     private static final long serialVersionUID = 0L;
1362   }
1363 
1364   /**
1365    * Returns a synchronized (thread-safe) bimap backed by the specified bimap.
1366    * In order to guarantee serial access, it is critical that <b>all</b> access
1367    * to the backing bimap is accomplished through the returned bimap.
1368    *
1369    * <p>It is imperative that the user manually synchronize on the returned map
1370    * when accessing any of its collection views: <pre>   {@code
1371    *
1372    *   BiMap<Long, String> map = Maps.synchronizedBiMap(
1373    *       HashBiMap.<Long, String>create());
1374    *   ...
1375    *   Set<Long> set = map.keySet();  // Needn't be in synchronized block
1376    *   ...
1377    *   synchronized (map) {  // Synchronizing on map, not set!
1378    *     Iterator<Long> it = set.iterator(); // Must be in synchronized block
1379    *     while (it.hasNext()) {
1380    *       foo(it.next());
1381    *     }
1382    *   }}</pre>
1383    *
1384    * <p>Failure to follow this advice may result in non-deterministic behavior.
1385    *
1386    * <p>The returned bimap will be serializable if the specified bimap is
1387    * serializable.
1388    *
1389    * @param bimap the bimap to be wrapped in a synchronized view
1390    * @return a sychronized view of the specified bimap
1391    */
1392   public static <K, V> BiMap<K, V> synchronizedBiMap(BiMap<K, V> bimap) {
1393     return Synchronized.biMap(bimap, null);
1394   }
1395 
1396   /**
1397    * Returns an unmodifiable view of the specified bimap. This method allows
1398    * modules to provide users with "read-only" access to internal bimaps. Query
1399    * operations on the returned bimap "read through" to the specified bimap, and
1400    * attempts to modify the returned map, whether direct or via its collection
1401    * views, result in an {@code UnsupportedOperationException}.
1402    *
1403    * <p>The returned bimap will be serializable if the specified bimap is
1404    * serializable.
1405    *
1406    * @param bimap the bimap for which an unmodifiable view is to be returned
1407    * @return an unmodifiable view of the specified bimap
1408    */
1409   public static <K, V> BiMap<K, V> unmodifiableBiMap(
1410       BiMap<? extends K, ? extends V> bimap) {
1411     return new UnmodifiableBiMap<K, V>(bimap, null);
1412   }
1413 
1414   /** @see Maps#unmodifiableBiMap(BiMap) */
1415   private static class UnmodifiableBiMap<K, V>
1416       extends ForwardingMap<K, V> implements BiMap<K, V>, Serializable {
1417     final Map<K, V> unmodifiableMap;
1418     final BiMap<? extends K, ? extends V> delegate;
1419     BiMap<V, K> inverse;
1420     transient Set<V> values;
1421 
1422     UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate,
1423         @Nullable BiMap<V, K> inverse) {
1424       unmodifiableMap = Collections.unmodifiableMap(delegate);
1425       this.delegate = delegate;
1426       this.inverse = inverse;
1427     }
1428 
1429     @Override protected Map<K, V> delegate() {
1430       return unmodifiableMap;
1431     }
1432 
1433     @Override
1434     public V forcePut(K key, V value) {
1435       throw new UnsupportedOperationException();
1436     }
1437 
1438     @Override
1439     public BiMap<V, K> inverse() {
1440       BiMap<V, K> result = inverse;
1441       return (result == null)
1442           ? inverse = new UnmodifiableBiMap<V, K>(delegate.inverse(), this)
1443           : result;
1444     }
1445 
1446     @Override public Set<V> values() {
1447       Set<V> result = values;
1448       return (result == null)
1449           ? values = Collections.unmodifiableSet(delegate.values())
1450           : result;
1451     }
1452 
1453     private static final long serialVersionUID = 0;
1454   }
1455 
1456   /**
1457    * Returns a view of a map where each value is transformed by a function. All
1458    * other properties of the map, such as iteration order, are left intact. For
1459    * example, the code: <pre>   {@code
1460    *
1461    *   Map<String, Integer> map = ImmutableMap.of("a", 4, "b", 9);
1462    *   Function<Integer, Double> sqrt =
1463    *       new Function<Integer, Double>() {
1464    *         public Double apply(Integer in) {
1465    *           return Math.sqrt((int) in);
1466    *         }
1467    *       };
1468    *   Map<String, Double> transformed = Maps.transformValues(map, sqrt);
1469    *   System.out.println(transformed);}</pre>
1470    *
1471    * ... prints {@code {a=2.0, b=3.0}}.
1472    *
1473    * <p>Changes in the underlying map are reflected in this view. Conversely,
1474    * this view supports removal operations, and these are reflected in the
1475    * underlying map.
1476    *
1477    * <p>It's acceptable for the underlying map to contain null keys, and even
1478    * null values provided that the function is capable of accepting null input.
1479    * The transformed map might contain null values, if the function sometimes
1480    * gives a null result.
1481    *
1482    * <p>The returned map is not thread-safe or serializable, even if the
1483    * underlying map is.
1484    *
1485    * <p>The function is applied lazily, invoked when needed. This is necessary
1486    * for the returned map to be a view, but it means that the function will be
1487    * applied many times for bulk operations like {@link Map#containsValue} and
1488    * {@code Map.toString()}. For this to perform well, {@code function} should
1489    * be fast. To avoid lazy evaluation when the returned map doesn't need to be
1490    * a view, copy the returned map into a new map of your choosing.
1491    */
1492   public static <K, V1, V2> Map<K, V2> transformValues(
1493       Map<K, V1> fromMap, Function<? super V1, V2> function) {
1494     return transformEntries(fromMap, asEntryTransformer(function));
1495   }
1496 
1497   /**
1498    * Returns a view of a sorted map where each value is transformed by a
1499    * function. All other properties of the map, such as iteration order, are
1500    * left intact. For example, the code: <pre>   {@code
1501    *
1502    *   SortedMap<String, Integer> map = ImmutableSortedMap.of("a", 4, "b", 9);
1503    *   Function<Integer, Double> sqrt =
1504    *       new Function<Integer, Double>() {
1505    *         public Double apply(Integer in) {
1506    *           return Math.sqrt((int) in);
1507    *         }
1508    *       };
1509    *   SortedMap<String, Double> transformed =
1510    *        Maps.transformValues(map, sqrt);
1511    *   System.out.println(transformed);}</pre>
1512    *
1513    * ... prints {@code {a=2.0, b=3.0}}.
1514    *
1515    * <p>Changes in the underlying map are reflected in this view. Conversely,
1516    * this view supports removal operations, and these are reflected in the
1517    * underlying map.
1518    *
1519    * <p>It's acceptable for the underlying map to contain null keys, and even
1520    * null values provided that the function is capable of accepting null input.
1521    * The transformed map might contain null values, if the function sometimes
1522    * gives a null result.
1523    *
1524    * <p>The returned map is not thread-safe or serializable, even if the
1525    * underlying map is.
1526    *
1527    * <p>The function is applied lazily, invoked when needed. This is necessary
1528    * for the returned map to be a view, but it means that the function will be
1529    * applied many times for bulk operations like {@link Map#containsValue} and
1530    * {@code Map.toString()}. For this to perform well, {@code function} should
1531    * be fast. To avoid lazy evaluation when the returned map doesn't need to be
1532    * a view, copy the returned map into a new map of your choosing.
1533    *
1534    * @since 11.0
1535    */
1536   public static <K, V1, V2> SortedMap<K, V2> transformValues(
1537       SortedMap<K, V1> fromMap, Function<? super V1, V2> function) {
1538     return transformEntries(fromMap, asEntryTransformer(function));
1539   }
1540 
1541   /**
1542    * Returns a view of a navigable map where each value is transformed by a
1543    * function. All other properties of the map, such as iteration order, are
1544    * left intact.  For example, the code: <pre>   {@code
1545    *
1546    *   NavigableMap<String, Integer> map = Maps.newTreeMap();
1547    *   map.put("a", 4);
1548    *   map.put("b", 9);
1549    *   Function<Integer, Double> sqrt =
1550    *       new Function<Integer, Double>() {
1551    *         public Double apply(Integer in) {
1552    *           return Math.sqrt((int) in);
1553    *         }
1554    *       };
1555    *   NavigableMap<String, Double> transformed =
1556    *        Maps.transformNavigableValues(map, sqrt);
1557    *   System.out.println(transformed);}</pre>
1558    *
1559    * ... prints {@code {a=2.0, b=3.0}}.
1560    *
1561    * Changes in the underlying map are reflected in this view.
1562    * Conversely, this view supports removal operations, and these are reflected
1563    * in the underlying map.
1564    *
1565    * <p>It's acceptable for the underlying map to contain null keys, and even
1566    * null values provided that the function is capable of accepting null input.
1567    * The transformed map might contain null values, if the function sometimes
1568    * gives a null result.
1569    *
1570    * <p>The returned map is not thread-safe or serializable, even if the
1571    * underlying map is.
1572    *
1573    * <p>The function is applied lazily, invoked when needed. This is necessary
1574    * for the returned map to be a view, but it means that the function will be
1575    * applied many times for bulk operations like {@link Map#containsValue} and
1576    * {@code Map.toString()}. For this to perform well, {@code function} should
1577    * be fast. To avoid lazy evaluation when the returned map doesn't need to be
1578    * a view, copy the returned map into a new map of your choosing.
1579    *
1580    * @since 13.0
1581    */
1582   @GwtIncompatible("NavigableMap")
1583   public static <K, V1, V2> NavigableMap<K, V2> transformValues(
1584       NavigableMap<K, V1> fromMap, Function<? super V1, V2> function) {
1585     return transformEntries(fromMap, asEntryTransformer(function));
1586   }
1587 
1588   /**
1589    * Returns a view of a map whose values are derived from the original map's
1590    * entries. In contrast to {@link #transformValues}, this method's
1591    * entry-transformation logic may depend on the key as well as the value.
1592    *
1593    * <p>All other properties of the transformed map, such as iteration order,
1594    * are left intact. For example, the code: <pre>   {@code
1595    *
1596    *   Map<String, Boolean> options =
1597    *       ImmutableMap.of("verbose", true, "sort", false);
1598    *   EntryTransformer<String, Boolean, String> flagPrefixer =
1599    *       new EntryTransformer<String, Boolean, String>() {
1600    *         public String transformEntry(String key, Boolean value) {
1601    *           return value ? key : "no" + key;
1602    *         }
1603    *       };
1604    *   Map<String, String> transformed =
1605    *       Maps.transformEntries(options, flagPrefixer);
1606    *   System.out.println(transformed);}</pre>
1607    *
1608    * ... prints {@code {verbose=verbose, sort=nosort}}.
1609    *
1610    * <p>Changes in the underlying map are reflected in this view. Conversely,
1611    * this view supports removal operations, and these are reflected in the
1612    * underlying map.
1613    *
1614    * <p>It's acceptable for the underlying map to contain null keys and null
1615    * values provided that the transformer is capable of accepting null inputs.
1616    * The transformed map might contain null values if the transformer sometimes
1617    * gives a null result.
1618    *
1619    * <p>The returned map is not thread-safe or serializable, even if the
1620    * underlying map is.
1621    *
1622    * <p>The transformer is applied lazily, invoked when needed. This is
1623    * necessary for the returned map to be a view, but it means that the
1624    * transformer will be applied many times for bulk operations like {@link
1625    * Map#containsValue} and {@link Object#toString}. For this to perform well,
1626    * {@code transformer} should be fast. To avoid lazy evaluation when the
1627    * returned map doesn't need to be a view, copy the returned map into a new
1628    * map of your choosing.
1629    *
1630    * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
1631    * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies
1632    * that {@code k2} is also of type {@code K}. Using an {@code
1633    * EntryTransformer} key type for which this may not hold, such as {@code
1634    * ArrayList}, may risk a {@code ClassCastException} when calling methods on
1635    * the transformed map.
1636    *
1637    * @since 7.0
1638    */
1639   public static <K, V1, V2> Map<K, V2> transformEntries(
1640       Map<K, V1> fromMap,
1641       EntryTransformer<? super K, ? super V1, V2> transformer) {
1642     if (fromMap instanceof SortedMap) {
1643       return transformEntries((SortedMap<K, V1>) fromMap, transformer);
1644     }
1645     return new TransformedEntriesMap<K, V1, V2>(fromMap, transformer);
1646   }
1647 
1648   /**
1649    * Returns a view of a sorted map whose values are derived from the original
1650    * sorted map's entries. In contrast to {@link #transformValues}, this
1651    * method's entry-transformation logic may depend on the key as well as the
1652    * value.
1653    *
1654    * <p>All other properties of the transformed map, such as iteration order,
1655    * are left intact. For example, the code: <pre>   {@code
1656    *
1657    *   Map<String, Boolean> options =
1658    *       ImmutableSortedMap.of("verbose", true, "sort", false);
1659    *   EntryTransformer<String, Boolean, String> flagPrefixer =
1660    *       new EntryTransformer<String, Boolean, String>() {
1661    *         public String transformEntry(String key, Boolean value) {
1662    *           return value ? key : "yes" + key;
1663    *         }
1664    *       };
1665    *   SortedMap<String, String> transformed =
1666    *       Maps.transformEntries(options, flagPrefixer);
1667    *   System.out.println(transformed);}</pre>
1668    *
1669    * ... prints {@code {sort=yessort, verbose=verbose}}.
1670    *
1671    * <p>Changes in the underlying map are reflected in this view. Conversely,
1672    * this view supports removal operations, and these are reflected in the
1673    * underlying map.
1674    *
1675    * <p>It's acceptable for the underlying map to contain null keys and null
1676    * values provided that the transformer is capable of accepting null inputs.
1677    * The transformed map might contain null values if the transformer sometimes
1678    * gives a null result.
1679    *
1680    * <p>The returned map is not thread-safe or serializable, even if the
1681    * underlying map is.
1682    *
1683    * <p>The transformer is applied lazily, invoked when needed. This is
1684    * necessary for the returned map to be a view, but it means that the
1685    * transformer will be applied many times for bulk operations like {@link
1686    * Map#containsValue} and {@link Object#toString}. For this to perform well,
1687    * {@code transformer} should be fast. To avoid lazy evaluation when the
1688    * returned map doesn't need to be a view, copy the returned map into a new
1689    * map of your choosing.
1690    *
1691    * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
1692    * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies
1693    * that {@code k2} is also of type {@code K}. Using an {@code
1694    * EntryTransformer} key type for which this may not hold, such as {@code
1695    * ArrayList}, may risk a {@code ClassCastException} when calling methods on
1696    * the transformed map.
1697    *
1698    * @since 11.0
1699    */
1700   public static <K, V1, V2> SortedMap<K, V2> transformEntries(
1701       SortedMap<K, V1> fromMap,
1702       EntryTransformer<? super K, ? super V1, V2> transformer) {
1703     return Platform.mapsTransformEntriesSortedMap(fromMap, transformer);
1704   }
1705 
1706   /**
1707    * Returns a view of a navigable map whose values are derived from the
1708    * original navigable map's entries. In contrast to {@link
1709    * #transformValues}, this method's entry-transformation logic may
1710    * depend on the key as well as the value.
1711    *
1712    * <p>All other properties of the transformed map, such as iteration order,
1713    * are left intact. For example, the code: <pre>   {@code
1714    *
1715    *   NavigableMap<String, Boolean> options = Maps.newTreeMap();
1716    *   options.put("verbose", false);
1717    *   options.put("sort", true);
1718    *   EntryTransformer<String, Boolean, String> flagPrefixer =
1719    *       new EntryTransformer<String, Boolean, String>() {
1720    *         public String transformEntry(String key, Boolean value) {
1721    *           return value ? key : ("yes" + key);
1722    *         }
1723    *       };
1724    *   NavigableMap<String, String> transformed =
1725    *       LabsMaps.transformNavigableEntries(options, flagPrefixer);
1726    *   System.out.println(transformed);}</pre>
1727    *
1728    * ... prints {@code {sort=yessort, verbose=verbose}}.
1729    *
1730    * <p>Changes in the underlying map are reflected in this view.
1731    * Conversely, this view supports removal operations, and these are reflected
1732    * in the underlying map.
1733    *
1734    * <p>It's acceptable for the underlying map to contain null keys and null
1735    * values provided that the transformer is capable of accepting null inputs.
1736    * The transformed map might contain null values if the transformer sometimes
1737    * gives a null result.
1738    *
1739    * <p>The returned map is not thread-safe or serializable, even if the
1740    * underlying map is.
1741    *
1742    * <p>The transformer is applied lazily, invoked when needed. This is
1743    * necessary for the returned map to be a view, but it means that the
1744    * transformer will be applied many times for bulk operations like {@link
1745    * Map#containsValue} and {@link Object#toString}. For this to perform well,
1746    * {@code transformer} should be fast. To avoid lazy evaluation when the
1747    * returned map doesn't need to be a view, copy the returned map into a new
1748    * map of your choosing.
1749    *
1750    * <p><b>Warning:</b> This method assumes that for any instance {@code k} of
1751    * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies
1752    * that {@code k2} is also of type {@code K}. Using an {@code
1753    * EntryTransformer} key type for which this may not hold, such as {@code
1754    * ArrayList}, may risk a {@code ClassCastException} when calling methods on
1755    * the transformed map.
1756    *
1757    * @since 13.0
1758    */
1759   @GwtIncompatible("NavigableMap")
1760   public static <K, V1, V2> NavigableMap<K, V2> transformEntries(
1761       final NavigableMap<K, V1> fromMap,
1762       EntryTransformer<? super K, ? super V1, V2> transformer) {
1763     return new TransformedEntriesNavigableMap<K, V1, V2>(fromMap, transformer);
1764   }
1765 
1766   static <K, V1, V2> SortedMap<K, V2> transformEntriesIgnoreNavigable(
1767       SortedMap<K, V1> fromMap,
1768       EntryTransformer<? super K, ? super V1, V2> transformer) {
1769     return new TransformedEntriesSortedMap<K, V1, V2>(fromMap, transformer);
1770   }
1771 
1772   /**
1773    * A transformation of the value of a key-value pair, using both key and value
1774    * as inputs. To apply the transformation to a map, use
1775    * {@link Maps#transformEntries(Map, EntryTransformer)}.
1776    *
1777    * @param <K> the key type of the input and output entries
1778    * @param <V1> the value type of the input entry
1779    * @param <V2> the value type of the output entry
1780    * @since 7.0
1781    */
1782   public interface EntryTransformer<K, V1, V2> {
1783     /**
1784      * Determines an output value based on a key-value pair. This method is
1785      * <i>generally expected</i>, but not absolutely required, to have the
1786      * following properties:
1787      *
1788      * <ul>
1789      * <li>Its execution does not cause any observable side effects.
1790      * <li>The computation is <i>consistent with equals</i>; that is,
1791      *     {@link Objects#equal Objects.equal}{@code (k1, k2) &&}
1792      *     {@link Objects#equal}{@code (v1, v2)} implies that {@code
1793      *     Objects.equal(transformer.transform(k1, v1),
1794      *     transformer.transform(k2, v2))}.
1795      * </ul>
1796      *
1797      * @throws NullPointerException if the key or value is null and this
1798      *     transformer does not accept null arguments
1799      */
1800     V2 transformEntry(@Nullable K key, @Nullable V1 value);
1801   }
1802 
1803   /**
1804    * Views a function as an entry transformer that ignores the entry key.
1805    */
1806   static <K, V1, V2> EntryTransformer<K, V1, V2>
1807       asEntryTransformer(final Function<? super V1, V2> function) {
1808     checkNotNull(function);
1809     return new EntryTransformer<K, V1, V2>() {
1810       @Override
1811       public V2 transformEntry(K key, V1 value) {
1812         return function.apply(value);
1813       }
1814     };
1815   }
1816 
1817   static <K, V1, V2> Function<V1, V2> asValueToValueFunction(
1818       final EntryTransformer<? super K, V1, V2> transformer, final K key) {
1819     checkNotNull(transformer);
1820     return new Function<V1, V2>() {
1821       @Override
1822       public V2 apply(@Nullable V1 v1) {
1823         return transformer.transformEntry(key, v1);
1824       }
1825     };
1826   }
1827 
1828   /**
1829    * Views an entry transformer as a function from {@code Entry} to values.
1830    */
1831   static <K, V1, V2> Function<Entry<K, V1>, V2> asEntryToValueFunction(
1832       final EntryTransformer<? super K, ? super V1, V2> transformer) {
1833     checkNotNull(transformer);
1834     return new Function<Entry<K, V1>, V2>() {
1835       @Override
1836       public V2 apply(Entry<K, V1> entry) {
1837         return transformer.transformEntry(entry.getKey(), entry.getValue());
1838       }
1839     };
1840   }
1841 
1842   /**
1843    * Returns a view of an entry transformed by the specified transformer.
1844    */
1845   static <V2, K, V1> Entry<K, V2> transformEntry(
1846       final EntryTransformer<? super K, ? super V1, V2> transformer, final Entry<K, V1> entry) {
1847     checkNotNull(transformer);
1848     checkNotNull(entry);
1849     return new AbstractMapEntry<K, V2>() {
1850       @Override
1851       public K getKey() {
1852         return entry.getKey();
1853       }
1854 
1855       @Override
1856       public V2 getValue() {
1857         return transformer.transformEntry(entry.getKey(), entry.getValue());
1858       }
1859     };
1860   }
1861 
1862   /**
1863    * Views an entry transformer as a function from entries to entries.
1864    */
1865   static <K, V1, V2> Function<Entry<K, V1>, Entry<K, V2>> asEntryToEntryFunction(
1866       final EntryTransformer<? super K, ? super V1, V2> transformer) {
1867     checkNotNull(transformer);
1868     return new Function<Entry<K, V1>, Entry<K, V2>>() {
1869       @Override
1870       public Entry<K, V2> apply(final Entry<K, V1> entry) {
1871         return transformEntry(transformer, entry);
1872       }
1873     };
1874   }
1875 
1876   static class TransformedEntriesMap<K, V1, V2>
1877       extends ImprovedAbstractMap<K, V2> {
1878     final Map<K, V1> fromMap;
1879     final EntryTransformer<? super K, ? super V1, V2> transformer;
1880 
1881     TransformedEntriesMap(
1882         Map<K, V1> fromMap,
1883         EntryTransformer<? super K, ? super V1, V2> transformer) {
1884       this.fromMap = checkNotNull(fromMap);
1885       this.transformer = checkNotNull(transformer);
1886     }
1887 
1888     @Override public int size() {
1889       return fromMap.size();
1890     }
1891 
1892     @Override public boolean containsKey(Object key) {
1893       return fromMap.containsKey(key);
1894     }
1895 
1896     // safe as long as the user followed the <b>Warning</b> in the javadoc
1897     @SuppressWarnings("unchecked")
1898     @Override public V2 get(Object key) {
1899       V1 value = fromMap.get(key);
1900       return (value != null || fromMap.containsKey(key))
1901           ? transformer.transformEntry((K) key, value)
1902           : null;
1903     }
1904 
1905     // safe as long as the user followed the <b>Warning</b> in the javadoc
1906     @SuppressWarnings("unchecked")
1907     @Override public V2 remove(Object key) {
1908       return fromMap.containsKey(key)
1909           ? transformer.transformEntry((K) key, fromMap.remove(key))
1910           : null;
1911     }
1912 
1913     @Override public void clear() {
1914       fromMap.clear();
1915     }
1916 
1917     @Override public Set<K> keySet() {
1918       return fromMap.keySet();
1919     }
1920 
1921     @Override
1922     protected Set<Entry<K, V2>> createEntrySet() {
1923       return new EntrySet<K, V2>() {
1924         @Override Map<K, V2> map() {
1925           return TransformedEntriesMap.this;
1926         }
1927 
1928         @Override public Iterator<Entry<K, V2>> iterator() {
1929           return Iterators.transform(fromMap.entrySet().iterator(),
1930               Maps.<K, V1, V2>asEntryToEntryFunction(transformer));
1931         }
1932       };
1933     }
1934   }
1935 
1936   static class TransformedEntriesSortedMap<K, V1, V2>
1937       extends TransformedEntriesMap<K, V1, V2> implements SortedMap<K, V2> {
1938 
1939     protected SortedMap<K, V1> fromMap() {
1940       return (SortedMap<K, V1>) fromMap;
1941     }
1942 
1943     TransformedEntriesSortedMap(SortedMap<K, V1> fromMap,
1944         EntryTransformer<? super K, ? super V1, V2> transformer) {
1945       super(fromMap, transformer);
1946     }
1947 
1948     @Override public Comparator<? super K> comparator() {
1949       return fromMap().comparator();
1950     }
1951 
1952     @Override public K firstKey() {
1953       return fromMap().firstKey();
1954     }
1955 
1956     @Override public SortedMap<K, V2> headMap(K toKey) {
1957       return transformEntries(fromMap().headMap(toKey), transformer);
1958     }
1959 
1960     @Override public K lastKey() {
1961       return fromMap().lastKey();
1962     }
1963 
1964     @Override public SortedMap<K, V2> subMap(K fromKey, K toKey) {
1965       return transformEntries(
1966           fromMap().subMap(fromKey, toKey), transformer);
1967     }
1968 
1969     @Override public SortedMap<K, V2> tailMap(K fromKey) {
1970       return transformEntries(fromMap().tailMap(fromKey), transformer);
1971     }
1972   }
1973 
1974   @GwtIncompatible("NavigableMap")
1975   private static class TransformedEntriesNavigableMap<K, V1, V2>
1976       extends TransformedEntriesSortedMap<K, V1, V2>
1977       implements NavigableMap<K, V2> {
1978 
1979     TransformedEntriesNavigableMap(NavigableMap<K, V1> fromMap,
1980         EntryTransformer<? super K, ? super V1, V2> transformer) {
1981       super(fromMap, transformer);
1982     }
1983 
1984     @Override public Entry<K, V2> ceilingEntry(K key) {
1985       return transformEntry(fromMap().ceilingEntry(key));
1986     }
1987 
1988     @Override public K ceilingKey(K key) {
1989       return fromMap().ceilingKey(key);
1990     }
1991 
1992     @Override public NavigableSet<K> descendingKeySet() {
1993       return fromMap().descendingKeySet();
1994     }
1995 
1996     @Override public NavigableMap<K, V2> descendingMap() {
1997       return transformEntries(fromMap().descendingMap(), transformer);
1998     }
1999 
2000     @Override public Entry<K, V2> firstEntry() {
2001       return transformEntry(fromMap().firstEntry());
2002     }
2003     @Override public Entry<K, V2> floorEntry(K key) {
2004       return transformEntry(fromMap().floorEntry(key));
2005     }
2006 
2007     @Override public K floorKey(K key) {
2008       return fromMap().floorKey(key);
2009     }
2010 
2011     @Override public NavigableMap<K, V2> headMap(K toKey) {
2012       return headMap(toKey, false);
2013     }
2014 
2015     @Override public NavigableMap<K, V2> headMap(K toKey, boolean inclusive) {
2016       return transformEntries(
2017           fromMap().headMap(toKey, inclusive), transformer);
2018     }
2019 
2020     @Override public Entry<K, V2> higherEntry(K key) {
2021       return transformEntry(fromMap().higherEntry(key));
2022     }
2023 
2024     @Override public K higherKey(K key) {
2025       return fromMap().higherKey(key);
2026     }
2027 
2028     @Override public Entry<K, V2> lastEntry() {
2029       return transformEntry(fromMap().lastEntry());
2030     }
2031 
2032     @Override public Entry<K, V2> lowerEntry(K key) {
2033       return transformEntry(fromMap().lowerEntry(key));
2034     }
2035 
2036     @Override public K lowerKey(K key) {
2037       return fromMap().lowerKey(key);
2038     }
2039 
2040     @Override public NavigableSet<K> navigableKeySet() {
2041       return fromMap().navigableKeySet();
2042     }
2043 
2044     @Override public Entry<K, V2> pollFirstEntry() {
2045       return transformEntry(fromMap().pollFirstEntry());
2046     }
2047 
2048     @Override public Entry<K, V2> pollLastEntry() {
2049       return transformEntry(fromMap().pollLastEntry());
2050     }
2051 
2052     @Override public NavigableMap<K, V2> subMap(
2053         K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
2054       return transformEntries(
2055           fromMap().subMap(fromKey, fromInclusive, toKey, toInclusive),
2056           transformer);
2057     }
2058 
2059     @Override public NavigableMap<K, V2> subMap(K fromKey, K toKey) {
2060       return subMap(fromKey, true, toKey, false);
2061     }
2062 
2063     @Override public NavigableMap<K, V2> tailMap(K fromKey) {
2064       return tailMap(fromKey, true);
2065     }
2066 
2067     @Override public NavigableMap<K, V2> tailMap(K fromKey, boolean inclusive) {
2068       return transformEntries(
2069           fromMap().tailMap(fromKey, inclusive), transformer);
2070     }
2071 
2072     @Nullable
2073     private Entry<K, V2> transformEntry(@Nullable Entry<K, V1> entry) {
2074       return (entry == null) ? null : Maps.transformEntry(transformer, entry);
2075     }
2076 
2077     @Override protected NavigableMap<K, V1> fromMap() {
2078       return (NavigableMap<K, V1>) super.fromMap();
2079     }
2080   }
2081 
2082   static <K> Predicate<Entry<K, ?>> keyPredicateOnEntries(Predicate<? super K> keyPredicate) {
2083     return compose(keyPredicate, Maps.<K>keyFunction());
2084   }
2085 
2086   static <V> Predicate<Entry<?, V>> valuePredicateOnEntries(Predicate<? super V> valuePredicate) {
2087     return compose(valuePredicate, Maps.<V>valueFunction());
2088   }
2089 
2090   /**
2091    * Returns a map containing the mappings in {@code unfiltered} whose keys
2092    * satisfy a predicate. The returned map is a live view of {@code unfiltered};
2093    * changes to one affect the other.
2094    *
2095    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2096    * values()} views have iterators that don't support {@code remove()}, but all
2097    * other methods are supported by the map and its views. When given a key that
2098    * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()}
2099    * methods throw an {@link IllegalArgumentException}.
2100    *
2101    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2102    * on the filtered map or its views, only mappings whose keys satisfy the
2103    * filter will be removed from the underlying map.
2104    *
2105    * <p>The returned map isn't threadsafe or serializable, even if {@code
2106    * unfiltered} is.
2107    *
2108    * <p>Many of the filtered map's methods, such as {@code size()},
2109    * iterate across every key/value mapping in the underlying map and determine
2110    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2111    * faster to copy the filtered map and use the copy.
2112    *
2113    * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with
2114    * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
2115    * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
2116    * inconsistent with equals.
2117    */
2118   public static <K, V> Map<K, V> filterKeys(
2119       Map<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
2120     if (unfiltered instanceof SortedMap) {
2121       return filterKeys((SortedMap<K, V>) unfiltered, keyPredicate);
2122     } else if (unfiltered instanceof BiMap) {
2123       return filterKeys((BiMap<K, V>) unfiltered, keyPredicate);
2124     }
2125     checkNotNull(keyPredicate);
2126     Predicate<Entry<K, ?>> entryPredicate = keyPredicateOnEntries(keyPredicate);
2127     return (unfiltered instanceof AbstractFilteredMap)
2128         ? filterFiltered((AbstractFilteredMap<K, V>) unfiltered, entryPredicate)
2129         : new FilteredKeyMap<K, V>(
2130             checkNotNull(unfiltered), keyPredicate, entryPredicate);
2131   }
2132 
2133   /**
2134    * Returns a sorted map containing the mappings in {@code unfiltered} whose
2135    * keys satisfy a predicate. The returned map is a live view of {@code
2136    * unfiltered}; changes to one affect the other.
2137    *
2138    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2139    * values()} views have iterators that don't support {@code remove()}, but all
2140    * other methods are supported by the map and its views. When given a key that
2141    * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()}
2142    * methods throw an {@link IllegalArgumentException}.
2143    *
2144    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2145    * on the filtered map or its views, only mappings whose keys satisfy the
2146    * filter will be removed from the underlying map.
2147    *
2148    * <p>The returned map isn't threadsafe or serializable, even if {@code
2149    * unfiltered} is.
2150    *
2151    * <p>Many of the filtered map's methods, such as {@code size()},
2152    * iterate across every key/value mapping in the underlying map and determine
2153    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2154    * faster to copy the filtered map and use the copy.
2155    *
2156    * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with
2157    * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
2158    * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
2159    * inconsistent with equals.
2160    *
2161    * @since 11.0
2162    */
2163   public static <K, V> SortedMap<K, V> filterKeys(
2164       SortedMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
2165     // TODO(user): Return a subclass of Maps.FilteredKeyMap for slightly better
2166     // performance.
2167     return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
2168   }
2169 
2170   /**
2171    * Returns a navigable map containing the mappings in {@code unfiltered} whose
2172    * keys satisfy a predicate. The returned map is a live view of {@code
2173    * unfiltered}; changes to one affect the other.
2174    *
2175    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2176    * values()} views have iterators that don't support {@code remove()}, but all
2177    * other methods are supported by the map and its views. When given a key that
2178    * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()}
2179    * methods throw an {@link IllegalArgumentException}.
2180    *
2181    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2182    * on the filtered map or its views, only mappings whose keys satisfy the
2183    * filter will be removed from the underlying map.
2184    *
2185    * <p>The returned map isn't threadsafe or serializable, even if {@code
2186    * unfiltered} is.
2187    *
2188    * <p>Many of the filtered map's methods, such as {@code size()},
2189    * iterate across every key/value mapping in the underlying map and determine
2190    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2191    * faster to copy the filtered map and use the copy.
2192    *
2193    * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with
2194    * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
2195    * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
2196    * inconsistent with equals.
2197    *
2198    * @since 14.0
2199    */
2200   @GwtIncompatible("NavigableMap")
2201   public static <K, V> NavigableMap<K, V> filterKeys(
2202       NavigableMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
2203     // TODO(user): Return a subclass of Maps.FilteredKeyMap for slightly better
2204     // performance.
2205     return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
2206   }
2207 
2208   /**
2209    * Returns a bimap containing the mappings in {@code unfiltered} whose keys satisfy a predicate.
2210    * The returned bimap is a live view of {@code unfiltered}; changes to one affect the other.
2211    *
2212    * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have
2213    * iterators that don't support {@code remove()}, but all other methods are supported by the
2214    * bimap and its views. When given a key that doesn't satisfy the predicate, the bimap's {@code
2215    * put()}, {@code forcePut()} and {@code putAll()} methods throw an {@link
2216    * IllegalArgumentException}.
2217    *
2218    * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered
2219    * bimap or its views, only mappings that satisfy the filter will be removed from the underlying
2220    * bimap.
2221    *
2222    * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is.
2223    *
2224    * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every key in
2225    * the underlying bimap and determine which satisfy the filter. When a live view is <i>not</i>
2226    * needed, it may be faster to copy the filtered bimap and use the copy.
2227    *
2228    * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as
2229    * documented at {@link Predicate#apply}.
2230    *
2231    * @since 14.0
2232    */
2233   public static <K, V> BiMap<K, V> filterKeys(
2234       BiMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
2235     checkNotNull(keyPredicate);
2236     return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
2237   }
2238 
2239   /**
2240    * Returns a map containing the mappings in {@code unfiltered} whose values
2241    * satisfy a predicate. The returned map is a live view of {@code unfiltered};
2242    * changes to one affect the other.
2243    *
2244    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2245    * values()} views have iterators that don't support {@code remove()}, but all
2246    * other methods are supported by the map and its views. When given a value
2247    * that doesn't satisfy the predicate, the map's {@code put()}, {@code
2248    * putAll()}, and {@link Entry#setValue} methods throw an {@link
2249    * IllegalArgumentException}.
2250    *
2251    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2252    * on the filtered map or its views, only mappings whose values satisfy the
2253    * filter will be removed from the underlying map.
2254    *
2255    * <p>The returned map isn't threadsafe or serializable, even if {@code
2256    * unfiltered} is.
2257    *
2258    * <p>Many of the filtered map's methods, such as {@code size()},
2259    * iterate across every key/value mapping in the underlying map and determine
2260    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2261    * faster to copy the filtered map and use the copy.
2262    *
2263    * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with
2264    * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
2265    * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
2266    * inconsistent with equals.
2267    */
2268   public static <K, V> Map<K, V> filterValues(
2269       Map<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
2270     if (unfiltered instanceof SortedMap) {
2271       return filterValues((SortedMap<K, V>) unfiltered, valuePredicate);
2272     } else if (unfiltered instanceof BiMap) {
2273       return filterValues((BiMap<K, V>) unfiltered, valuePredicate);
2274     }
2275     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
2276   }
2277 
2278   /**
2279    * Returns a sorted map containing the mappings in {@code unfiltered} whose
2280    * values satisfy a predicate. The returned map is a live view of {@code
2281    * unfiltered}; changes to one affect the other.
2282    *
2283    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2284    * values()} views have iterators that don't support {@code remove()}, but all
2285    * other methods are supported by the map and its views. When given a value
2286    * that doesn't satisfy the predicate, the map's {@code put()}, {@code
2287    * putAll()}, and {@link Entry#setValue} methods throw an {@link
2288    * IllegalArgumentException}.
2289    *
2290    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2291    * on the filtered map or its views, only mappings whose values satisfy the
2292    * filter will be removed from the underlying map.
2293    *
2294    * <p>The returned map isn't threadsafe or serializable, even if {@code
2295    * unfiltered} is.
2296    *
2297    * <p>Many of the filtered map's methods, such as {@code size()},
2298    * iterate across every key/value mapping in the underlying map and determine
2299    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2300    * faster to copy the filtered map and use the copy.
2301    *
2302    * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with
2303    * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
2304    * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
2305    * inconsistent with equals.
2306    *
2307    * @since 11.0
2308    */
2309   public static <K, V> SortedMap<K, V> filterValues(
2310       SortedMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
2311     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
2312   }
2313 
2314   /**
2315    * Returns a navigable map containing the mappings in {@code unfiltered} whose
2316    * values satisfy a predicate. The returned map is a live view of {@code
2317    * unfiltered}; changes to one affect the other.
2318    *
2319    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2320    * values()} views have iterators that don't support {@code remove()}, but all
2321    * other methods are supported by the map and its views. When given a value
2322    * that doesn't satisfy the predicate, the map's {@code put()}, {@code
2323    * putAll()}, and {@link Entry#setValue} methods throw an {@link
2324    * IllegalArgumentException}.
2325    *
2326    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2327    * on the filtered map or its views, only mappings whose values satisfy the
2328    * filter will be removed from the underlying map.
2329    *
2330    * <p>The returned map isn't threadsafe or serializable, even if {@code
2331    * unfiltered} is.
2332    *
2333    * <p>Many of the filtered map's methods, such as {@code size()},
2334    * iterate across every key/value mapping in the underlying map and determine
2335    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2336    * faster to copy the filtered map and use the copy.
2337    *
2338    * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with
2339    * equals</i>, as documented at {@link Predicate#apply}. Do not provide a
2340    * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is
2341    * inconsistent with equals.
2342    *
2343    * @since 14.0
2344    */
2345   @GwtIncompatible("NavigableMap")
2346   public static <K, V> NavigableMap<K, V> filterValues(
2347       NavigableMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
2348     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
2349   }
2350 
2351   /**
2352    * Returns a bimap containing the mappings in {@code unfiltered} whose values satisfy a
2353    * predicate. The returned bimap is a live view of {@code unfiltered}; changes to one affect the
2354    * other.
2355    *
2356    * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have
2357    * iterators that don't support {@code remove()}, but all other methods are supported by the
2358    * bimap and its views. When given a value that doesn't satisfy the predicate, the bimap's
2359    * {@code put()}, {@code forcePut()} and {@code putAll()} methods throw an {@link
2360    * IllegalArgumentException}. Similarly, the map's entries have a {@link Entry#setValue} method
2361    * that throws an {@link IllegalArgumentException} when the provided value doesn't satisfy the
2362    * predicate.
2363    *
2364    * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered
2365    * bimap or its views, only mappings that satisfy the filter will be removed from the underlying
2366    * bimap.
2367    *
2368    * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is.
2369    *
2370    * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every value in
2371    * the underlying bimap and determine which satisfy the filter. When a live view is <i>not</i>
2372    * needed, it may be faster to copy the filtered bimap and use the copy.
2373    *
2374    * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as
2375    * documented at {@link Predicate#apply}.
2376    *
2377    * @since 14.0
2378    */
2379   public static <K, V> BiMap<K, V> filterValues(
2380       BiMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
2381     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
2382   }
2383 
2384   /**
2385    * Returns a map containing the mappings in {@code unfiltered} that satisfy a
2386    * predicate. The returned map is a live view of {@code unfiltered}; changes
2387    * to one affect the other.
2388    *
2389    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2390    * values()} views have iterators that don't support {@code remove()}, but all
2391    * other methods are supported by the map and its views. When given a
2392    * key/value pair that doesn't satisfy the predicate, the map's {@code put()}
2393    * and {@code putAll()} methods throw an {@link IllegalArgumentException}.
2394    * Similarly, the map's entries have a {@link Entry#setValue} method that
2395    * throws an {@link IllegalArgumentException} when the existing key and the
2396    * provided value don't satisfy the predicate.
2397    *
2398    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2399    * on the filtered map or its views, only mappings that satisfy the filter
2400    * will be removed from the underlying map.
2401    *
2402    * <p>The returned map isn't threadsafe or serializable, even if {@code
2403    * unfiltered} is.
2404    *
2405    * <p>Many of the filtered map's methods, such as {@code size()},
2406    * iterate across every key/value mapping in the underlying map and determine
2407    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2408    * faster to copy the filtered map and use the copy.
2409    *
2410    * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with
2411    * equals</i>, as documented at {@link Predicate#apply}.
2412    */
2413   public static <K, V> Map<K, V> filterEntries(
2414       Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
2415     if (unfiltered instanceof SortedMap) {
2416       return filterEntries((SortedMap<K, V>) unfiltered, entryPredicate);
2417     } else if (unfiltered instanceof BiMap) {
2418       return filterEntries((BiMap<K, V>) unfiltered, entryPredicate);
2419     }
2420     checkNotNull(entryPredicate);
2421     return (unfiltered instanceof AbstractFilteredMap)
2422         ? filterFiltered((AbstractFilteredMap<K, V>) unfiltered, entryPredicate)
2423         : new FilteredEntryMap<K, V>(checkNotNull(unfiltered), entryPredicate);
2424   }
2425 
2426   /**
2427    * Returns a sorted map containing the mappings in {@code unfiltered} that
2428    * satisfy a predicate. The returned map is a live view of {@code unfiltered};
2429    * changes to one affect the other.
2430    *
2431    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2432    * values()} views have iterators that don't support {@code remove()}, but all
2433    * other methods are supported by the map and its views. When given a
2434    * key/value pair that doesn't satisfy the predicate, the map's {@code put()}
2435    * and {@code putAll()} methods throw an {@link IllegalArgumentException}.
2436    * Similarly, the map's entries have a {@link Entry#setValue} method that
2437    * throws an {@link IllegalArgumentException} when the existing key and the
2438    * provided value don't satisfy the predicate.
2439    *
2440    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2441    * on the filtered map or its views, only mappings that satisfy the filter
2442    * will be removed from the underlying map.
2443    *
2444    * <p>The returned map isn't threadsafe or serializable, even if {@code
2445    * unfiltered} is.
2446    *
2447    * <p>Many of the filtered map's methods, such as {@code size()},
2448    * iterate across every key/value mapping in the underlying map and determine
2449    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2450    * faster to copy the filtered map and use the copy.
2451    *
2452    * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with
2453    * equals</i>, as documented at {@link Predicate#apply}.
2454    *
2455    * @since 11.0
2456    */
2457   public static <K, V> SortedMap<K, V> filterEntries(
2458       SortedMap<K, V> unfiltered,
2459       Predicate<? super Entry<K, V>> entryPredicate) {
2460     return Platform.mapsFilterSortedMap(unfiltered, entryPredicate);
2461   }
2462 
2463   static <K, V> SortedMap<K, V> filterSortedIgnoreNavigable(
2464       SortedMap<K, V> unfiltered,
2465       Predicate<? super Entry<K, V>> entryPredicate) {
2466     checkNotNull(entryPredicate);
2467     return (unfiltered instanceof FilteredEntrySortedMap)
2468         ? filterFiltered((FilteredEntrySortedMap<K, V>) unfiltered, entryPredicate)
2469         : new FilteredEntrySortedMap<K, V>(checkNotNull(unfiltered), entryPredicate);
2470   }
2471 
2472   /**
2473    * Returns a sorted map containing the mappings in {@code unfiltered} that
2474    * satisfy a predicate. The returned map is a live view of {@code unfiltered};
2475    * changes to one affect the other.
2476    *
2477    * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code
2478    * values()} views have iterators that don't support {@code remove()}, but all
2479    * other methods are supported by the map and its views. When given a
2480    * key/value pair that doesn't satisfy the predicate, the map's {@code put()}
2481    * and {@code putAll()} methods throw an {@link IllegalArgumentException}.
2482    * Similarly, the map's entries have a {@link Entry#setValue} method that
2483    * throws an {@link IllegalArgumentException} when the existing key and the
2484    * provided value don't satisfy the predicate.
2485    *
2486    * <p>When methods such as {@code removeAll()} and {@code clear()} are called
2487    * on the filtered map or its views, only mappings that satisfy the filter
2488    * will be removed from the underlying map.
2489    *
2490    * <p>The returned map isn't threadsafe or serializable, even if {@code
2491    * unfiltered} is.
2492    *
2493    * <p>Many of the filtered map's methods, such as {@code size()},
2494    * iterate across every key/value mapping in the underlying map and determine
2495    * which satisfy the filter. When a live view is <i>not</i> needed, it may be
2496    * faster to copy the filtered map and use the copy.
2497    *
2498    * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with
2499    * equals</i>, as documented at {@link Predicate#apply}.
2500    *
2501    * @since 14.0
2502    */
2503   @GwtIncompatible("NavigableMap")
2504   public static <K, V> NavigableMap<K, V> filterEntries(
2505       NavigableMap<K, V> unfiltered,
2506       Predicate<? super Entry<K, V>> entryPredicate) {
2507     checkNotNull(entryPredicate);
2508     return (unfiltered instanceof FilteredEntryNavigableMap)
2509         ? filterFiltered((FilteredEntryNavigableMap<K, V>) unfiltered, entryPredicate)
2510         : new FilteredEntryNavigableMap<K, V>(checkNotNull(unfiltered), entryPredicate);
2511   }
2512 
2513   /**
2514    * Returns a bimap containing the mappings in {@code unfiltered} that satisfy a predicate. The
2515    * returned bimap is a live view of {@code unfiltered}; changes to one affect the other.
2516    *
2517    * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have
2518    * iterators that don't support {@code remove()}, but all other methods are supported by the bimap
2519    * and its views. When given a key/value pair that doesn't satisfy the predicate, the bimap's
2520    * {@code put()}, {@code forcePut()} and {@code putAll()} methods throw an
2521    * {@link IllegalArgumentException}. Similarly, the map's entries have an {@link Entry#setValue}
2522    * method that throws an {@link IllegalArgumentException} when the existing key and the provided
2523    * value don't satisfy the predicate.
2524    *
2525    * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered
2526    * bimap or its views, only mappings that satisfy the filter will be removed from the underlying
2527    * bimap.
2528    *
2529    * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is.
2530    *
2531    * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every
2532    * key/value mapping in the underlying bimap and determine which satisfy the filter. When a live
2533    * view is <i>not</i> needed, it may be faster to copy the filtered bimap and use the copy.
2534    *
2535    * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as
2536    * documented at {@link Predicate#apply}.
2537    *
2538    * @since 14.0
2539    */
2540   public static <K, V> BiMap<K, V> filterEntries(
2541       BiMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
2542     checkNotNull(unfiltered);
2543     checkNotNull(entryPredicate);
2544     return (unfiltered instanceof FilteredEntryBiMap)
2545         ? filterFiltered((FilteredEntryBiMap<K, V>) unfiltered, entryPredicate)
2546         : new FilteredEntryBiMap<K, V>(unfiltered, entryPredicate);
2547   }
2548 
2549   /**
2550    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when
2551    * filtering a filtered map.
2552    */
2553   private static <K, V> Map<K, V> filterFiltered(AbstractFilteredMap<K, V> map,
2554       Predicate<? super Entry<K, V>> entryPredicate) {
2555     return new FilteredEntryMap<K, V>(map.unfiltered,
2556         Predicates.<Entry<K, V>>and(map.predicate, entryPredicate));
2557   }
2558 
2559   private abstract static class AbstractFilteredMap<K, V>
2560       extends ImprovedAbstractMap<K, V> {
2561     final Map<K, V> unfiltered;
2562     final Predicate<? super Entry<K, V>> predicate;
2563 
2564     AbstractFilteredMap(
2565         Map<K, V> unfiltered, Predicate<? super Entry<K, V>> predicate) {
2566       this.unfiltered = unfiltered;
2567       this.predicate = predicate;
2568     }
2569 
2570     boolean apply(@Nullable Object key, @Nullable V value) {
2571       // This method is called only when the key is in the map, implying that
2572       // key is a K.
2573       @SuppressWarnings("unchecked")
2574       K k = (K) key;
2575       return predicate.apply(Maps.immutableEntry(k, value));
2576     }
2577 
2578     @Override public V put(K key, V value) {
2579       checkArgument(apply(key, value));
2580       return unfiltered.put(key, value);
2581     }
2582 
2583     @Override public void putAll(Map<? extends K, ? extends V> map) {
2584       for (Entry<? extends K, ? extends V> entry : map.entrySet()) {
2585         checkArgument(apply(entry.getKey(), entry.getValue()));
2586       }
2587       unfiltered.putAll(map);
2588     }
2589 
2590     @Override public boolean containsKey(Object key) {
2591       return unfiltered.containsKey(key) && apply(key, unfiltered.get(key));
2592     }
2593 
2594     @Override public V get(Object key) {
2595       V value = unfiltered.get(key);
2596       return ((value != null) && apply(key, value)) ? value : null;
2597     }
2598 
2599     @Override public boolean isEmpty() {
2600       return entrySet().isEmpty();
2601     }
2602 
2603     @Override public V remove(Object key) {
2604       return containsKey(key) ? unfiltered.remove(key) : null;
2605     }
2606 
2607     @Override
2608     Collection<V> createValues() {
2609       return new FilteredMapValues<K, V>(this, unfiltered, predicate);
2610     }
2611   }
2612 
2613   private static final class FilteredMapValues<K, V> extends Maps.Values<K, V> {
2614     Map<K, V> unfiltered;
2615     Predicate<? super Entry<K, V>> predicate;
2616 
2617     FilteredMapValues(Map<K, V> filteredMap, Map<K, V> unfiltered,
2618         Predicate<? super Entry<K, V>> predicate) {
2619       super(filteredMap);
2620       this.unfiltered = unfiltered;
2621       this.predicate = predicate;
2622     }
2623 
2624     @Override public boolean remove(Object o) {
2625       return Iterables.removeFirstMatching(unfiltered.entrySet(),
2626           Predicates.<Entry<K, V>>and(predicate, Maps.<V>valuePredicateOnEntries(equalTo(o))))
2627           != null;
2628     }
2629 
2630     private boolean removeIf(Predicate<? super V> valuePredicate) {
2631       return Iterables.removeIf(unfiltered.entrySet(), Predicates.<Entry<K, V>>and(
2632           predicate, Maps.<V>valuePredicateOnEntries(valuePredicate)));
2633     }
2634 
2635     @Override public boolean removeAll(Collection<?> collection) {
2636       return removeIf(in(collection));
2637     }
2638 
2639     @Override public boolean retainAll(Collection<?> collection) {
2640       return removeIf(not(in(collection)));
2641     }
2642 
2643     @Override public Object[] toArray() {
2644       // creating an ArrayList so filtering happens once
2645       return Lists.newArrayList(iterator()).toArray();
2646     }
2647 
2648     @Override public <T> T[] toArray(T[] array) {
2649       return Lists.newArrayList(iterator()).toArray(array);
2650     }
2651   }
2652 
2653   private static class FilteredKeyMap<K, V> extends AbstractFilteredMap<K, V> {
2654     Predicate<? super K> keyPredicate;
2655 
2656     FilteredKeyMap(Map<K, V> unfiltered, Predicate<? super K> keyPredicate,
2657         Predicate<? super Entry<K, V>> entryPredicate) {
2658       super(unfiltered, entryPredicate);
2659       this.keyPredicate = keyPredicate;
2660     }
2661 
2662     @Override
2663     protected Set<Entry<K, V>> createEntrySet() {
2664       return Sets.filter(unfiltered.entrySet(), predicate);
2665     }
2666 
2667     @Override
2668     Set<K> createKeySet() {
2669       return Sets.filter(unfiltered.keySet(), keyPredicate);
2670     }
2671 
2672     // The cast is called only when the key is in the unfiltered map, implying
2673     // that key is a K.
2674     @Override
2675     @SuppressWarnings("unchecked")
2676     public boolean containsKey(Object key) {
2677       return unfiltered.containsKey(key) && keyPredicate.apply((K) key);
2678     }
2679   }
2680 
2681   static class FilteredEntryMap<K, V> extends AbstractFilteredMap<K, V> {
2682     /**
2683      * Entries in this set satisfy the predicate, but they don't validate the
2684      * input to {@code Entry.setValue()}.
2685      */
2686     final Set<Entry<K, V>> filteredEntrySet;
2687 
2688     FilteredEntryMap(
2689         Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
2690       super(unfiltered, entryPredicate);
2691       filteredEntrySet = Sets.filter(unfiltered.entrySet(), predicate);
2692     }
2693 
2694     @Override
2695     protected Set<Entry<K, V>> createEntrySet() {
2696       return new EntrySet();
2697     }
2698 
2699     private class EntrySet extends ForwardingSet<Entry<K, V>> {
2700       @Override protected Set<Entry<K, V>> delegate() {
2701         return filteredEntrySet;
2702       }
2703 
2704       @Override public Iterator<Entry<K, V>> iterator() {
2705         return new TransformedIterator<Entry<K, V>, Entry<K, V>>(filteredEntrySet.iterator()) {
2706           @Override
2707           Entry<K, V> transform(final Entry<K, V> entry) {
2708             return new ForwardingMapEntry<K, V>() {
2709               @Override
2710               protected Entry<K, V> delegate() {
2711                 return entry;
2712               }
2713 
2714               @Override
2715               public V setValue(V newValue) {
2716                 checkArgument(apply(getKey(), newValue));
2717                 return super.setValue(newValue);
2718               }
2719             };
2720           }
2721         };
2722       }
2723     }
2724 
2725     @Override
2726     Set<K> createKeySet() {
2727       return new KeySet();
2728     }
2729 
2730     class KeySet extends Maps.KeySet<K, V> {
2731       KeySet() {
2732         super(FilteredEntryMap.this);
2733       }
2734 
2735       @Override public boolean remove(Object o) {
2736         if (containsKey(o)) {
2737           unfiltered.remove(o);
2738           return true;
2739         }
2740         return false;
2741       }
2742 
2743       private boolean removeIf(Predicate<? super K> keyPredicate) {
2744         return Iterables.removeIf(unfiltered.entrySet(), Predicates.<Entry<K, V>>and(
2745             predicate, Maps.<K>keyPredicateOnEntries(keyPredicate)));
2746       }
2747 
2748       @Override
2749       public boolean removeAll(Collection<?> c) {
2750         return removeIf(in(c));
2751       }
2752 
2753       @Override
2754       public boolean retainAll(Collection<?> c) {
2755         return removeIf(not(in(c)));
2756       }
2757 
2758       @Override public Object[] toArray() {
2759         // creating an ArrayList so filtering happens once
2760         return Lists.newArrayList(iterator()).toArray();
2761       }
2762 
2763       @Override public <T> T[] toArray(T[] array) {
2764         return Lists.newArrayList(iterator()).toArray(array);
2765       }
2766     }
2767   }
2768 
2769   /**
2770    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when
2771    * filtering a filtered sorted map.
2772    */
2773   private static <K, V> SortedMap<K, V> filterFiltered(
2774       FilteredEntrySortedMap<K, V> map,
2775       Predicate<? super Entry<K, V>> entryPredicate) {
2776     Predicate<Entry<K, V>> predicate
2777         = Predicates.and(map.predicate, entryPredicate);
2778     return new FilteredEntrySortedMap<K, V>(map.sortedMap(), predicate);
2779   }
2780 
2781   private static class FilteredEntrySortedMap<K, V>
2782       extends FilteredEntryMap<K, V> implements SortedMap<K, V> {
2783 
2784     FilteredEntrySortedMap(SortedMap<K, V> unfiltered,
2785         Predicate<? super Entry<K, V>> entryPredicate) {
2786       super(unfiltered, entryPredicate);
2787     }
2788 
2789     SortedMap<K, V> sortedMap() {
2790       return (SortedMap<K, V>) unfiltered;
2791     }
2792 
2793     @Override public SortedSet<K> keySet() {
2794       return (SortedSet<K>) super.keySet();
2795     }
2796 
2797     @Override
2798     SortedSet<K> createKeySet() {
2799       return new SortedKeySet();
2800     }
2801 
2802     class SortedKeySet extends KeySet implements SortedSet<K> {
2803       @Override
2804       public Comparator<? super K> comparator() {
2805         return sortedMap().comparator();
2806       }
2807 
2808       @Override
2809       public SortedSet<K> subSet(K fromElement, K toElement) {
2810         return (SortedSet<K>) subMap(fromElement, toElement).keySet();
2811       }
2812 
2813       @Override
2814       public SortedSet<K> headSet(K toElement) {
2815         return (SortedSet<K>) headMap(toElement).keySet();
2816       }
2817 
2818       @Override
2819       public SortedSet<K> tailSet(K fromElement) {
2820         return (SortedSet<K>) tailMap(fromElement).keySet();
2821       }
2822 
2823       @Override
2824       public K first() {
2825         return firstKey();
2826       }
2827 
2828       @Override
2829       public K last() {
2830         return lastKey();
2831       }
2832     }
2833 
2834     @Override public Comparator<? super K> comparator() {
2835       return sortedMap().comparator();
2836     }
2837 
2838     @Override public K firstKey() {
2839       // correctly throws NoSuchElementException when filtered map is empty.
2840       return keySet().iterator().next();
2841     }
2842 
2843     @Override public K lastKey() {
2844       SortedMap<K, V> headMap = sortedMap();
2845       while (true) {
2846         // correctly throws NoSuchElementException when filtered map is empty.
2847         K key = headMap.lastKey();
2848         if (apply(key, unfiltered.get(key))) {
2849           return key;
2850         }
2851         headMap = sortedMap().headMap(key);
2852       }
2853     }
2854 
2855     @Override public SortedMap<K, V> headMap(K toKey) {
2856       return new FilteredEntrySortedMap<K, V>(sortedMap().headMap(toKey), predicate);
2857     }
2858 
2859     @Override public SortedMap<K, V> subMap(K fromKey, K toKey) {
2860       return new FilteredEntrySortedMap<K, V>(
2861           sortedMap().subMap(fromKey, toKey), predicate);
2862     }
2863 
2864     @Override public SortedMap<K, V> tailMap(K fromKey) {
2865       return new FilteredEntrySortedMap<K, V>(
2866           sortedMap().tailMap(fromKey), predicate);
2867     }
2868   }
2869 
2870   /**
2871    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when
2872    * filtering a filtered navigable map.
2873    */
2874   @GwtIncompatible("NavigableMap")
2875   private static <K, V> NavigableMap<K, V> filterFiltered(
2876       FilteredEntryNavigableMap<K, V> map,
2877       Predicate<? super Entry<K, V>> entryPredicate) {
2878     Predicate<Entry<K, V>> predicate
2879         = Predicates.and(map.entryPredicate, entryPredicate);
2880     return new FilteredEntryNavigableMap<K, V>(map.unfiltered, predicate);
2881   }
2882 
2883   @GwtIncompatible("NavigableMap")
2884   private static class FilteredEntryNavigableMap<K, V> extends AbstractNavigableMap<K, V> {
2885     /*
2886      * It's less code to extend AbstractNavigableMap and forward the filtering logic to
2887      * FilteredEntryMap than to extend FilteredEntrySortedMap and reimplement all the NavigableMap
2888      * methods.
2889      */
2890 
2891     private final NavigableMap<K, V> unfiltered;
2892     private final Predicate<? super Entry<K, V>> entryPredicate;
2893     private final Map<K, V> filteredDelegate;
2894 
2895     FilteredEntryNavigableMap(
2896         NavigableMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
2897       this.unfiltered = checkNotNull(unfiltered);
2898       this.entryPredicate = entryPredicate;
2899       this.filteredDelegate = new FilteredEntryMap<K, V>(unfiltered, entryPredicate);
2900     }
2901 
2902     @Override
2903     public Comparator<? super K> comparator() {
2904       return unfiltered.comparator();
2905     }
2906 
2907     @Override
2908     public NavigableSet<K> navigableKeySet() {
2909       return new Maps.NavigableKeySet<K, V>(this) {
2910         @Override
2911         public boolean removeAll(Collection<?> c) {
2912           return Iterators.removeIf(unfiltered.entrySet().iterator(),
2913               Predicates.<Entry<K, V>>and(entryPredicate, Maps.<K>keyPredicateOnEntries(in(c))));
2914         }
2915 
2916         @Override
2917         public boolean retainAll(Collection<?> c) {
2918           return Iterators.removeIf(unfiltered.entrySet().iterator(), Predicates.<Entry<K, V>>and(
2919               entryPredicate, Maps.<K>keyPredicateOnEntries(not(in(c)))));
2920         }
2921       };
2922     }
2923 
2924     @Override
2925     public Collection<V> values() {
2926       return new FilteredMapValues<K, V>(this, unfiltered, entryPredicate);
2927     }
2928 
2929     @Override
2930     Iterator<Entry<K, V>> entryIterator() {
2931       return Iterators.filter(unfiltered.entrySet().iterator(), entryPredicate);
2932     }
2933 
2934     @Override
2935     Iterator<Entry<K, V>> descendingEntryIterator() {
2936       return Iterators.filter(unfiltered.descendingMap().entrySet().iterator(), entryPredicate);
2937     }
2938 
2939     @Override
2940     public int size() {
2941       return filteredDelegate.size();
2942     }
2943 
2944     @Override
2945     public boolean isEmpty() {
2946       return !Iterables.any(unfiltered.entrySet(), entryPredicate);
2947     }
2948 
2949     @Override
2950     @Nullable
2951     public V get(@Nullable Object key) {
2952       return filteredDelegate.get(key);
2953     }
2954 
2955     @Override
2956     public boolean containsKey(@Nullable Object key) {
2957       return filteredDelegate.containsKey(key);
2958     }
2959 
2960     @Override
2961     public V put(K key, V value) {
2962       return filteredDelegate.put(key, value);
2963     }
2964 
2965     @Override
2966     public V remove(@Nullable Object key) {
2967       return filteredDelegate.remove(key);
2968     }
2969 
2970     @Override
2971     public void putAll(Map<? extends K, ? extends V> m) {
2972       filteredDelegate.putAll(m);
2973     }
2974 
2975     @Override
2976     public void clear() {
2977       filteredDelegate.clear();
2978     }
2979 
2980     @Override
2981     public Set<Entry<K, V>> entrySet() {
2982       return filteredDelegate.entrySet();
2983     }
2984 
2985     @Override
2986     public Entry<K, V> pollFirstEntry() {
2987       return Iterables.removeFirstMatching(unfiltered.entrySet(), entryPredicate);
2988     }
2989 
2990     @Override
2991     public Entry<K, V> pollLastEntry() {
2992       return Iterables.removeFirstMatching(unfiltered.descendingMap().entrySet(), entryPredicate);
2993     }
2994 
2995     @Override
2996     public NavigableMap<K, V> descendingMap() {
2997       return filterEntries(unfiltered.descendingMap(), entryPredicate);
2998     }
2999 
3000     @Override
3001     public NavigableMap<K, V> subMap(
3002         K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
3003       return filterEntries(
3004           unfiltered.subMap(fromKey, fromInclusive, toKey, toInclusive), entryPredicate);
3005     }
3006 
3007     @Override
3008     public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
3009       return filterEntries(unfiltered.headMap(toKey, inclusive), entryPredicate);
3010     }
3011 
3012     @Override
3013     public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
3014       return filterEntries(unfiltered.tailMap(fromKey, inclusive), entryPredicate);
3015     }
3016   }
3017 
3018   /**
3019    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when
3020    * filtering a filtered map.
3021    */
3022   private static <K, V> BiMap<K, V> filterFiltered(
3023       FilteredEntryBiMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
3024     Predicate<Entry<K, V>> predicate = Predicates.and(map.predicate, entryPredicate);
3025     return new FilteredEntryBiMap<K, V>(map.unfiltered(), predicate);
3026   }
3027 
3028   static final class FilteredEntryBiMap<K, V> extends FilteredEntryMap<K, V>
3029       implements BiMap<K, V> {
3030     private final BiMap<V, K> inverse;
3031 
3032     private static <K, V> Predicate<Entry<V, K>> inversePredicate(
3033         final Predicate<? super Entry<K, V>> forwardPredicate) {
3034       return new Predicate<Entry<V, K>>() {
3035         @Override
3036         public boolean apply(Entry<V, K> input) {
3037           return forwardPredicate.apply(
3038               Maps.immutableEntry(input.getValue(), input.getKey()));
3039         }
3040       };
3041     }
3042 
3043     FilteredEntryBiMap(BiMap<K, V> delegate,
3044         Predicate<? super Entry<K, V>> predicate) {
3045       super(delegate, predicate);
3046       this.inverse = new FilteredEntryBiMap<V, K>(
3047           delegate.inverse(), inversePredicate(predicate), this);
3048     }
3049 
3050     private FilteredEntryBiMap(
3051         BiMap<K, V> delegate, Predicate<? super Entry<K, V>> predicate,
3052         BiMap<V, K> inverse) {
3053       super(delegate, predicate);
3054       this.inverse = inverse;
3055     }
3056 
3057     BiMap<K, V> unfiltered() {
3058       return (BiMap<K, V>) unfiltered;
3059     }
3060 
3061     @Override
3062     public V forcePut(@Nullable K key, @Nullable V value) {
3063       checkArgument(apply(key, value));
3064       return unfiltered().forcePut(key, value);
3065     }
3066 
3067     @Override
3068     public BiMap<V, K> inverse() {
3069       return inverse;
3070     }
3071 
3072     @Override
3073     public Set<V> values() {
3074       return inverse.keySet();
3075     }
3076   }
3077 
3078   /**
3079    * Returns an unmodifiable view of the specified navigable map. Query operations on the returned
3080    * map read through to the specified map, and attempts to modify the returned map, whether direct
3081    * or via its views, result in an {@code UnsupportedOperationException}.
3082    *
3083    * <p>The returned navigable map will be serializable if the specified navigable map is
3084    * serializable.
3085    *
3086    * @param map the navigable map for which an unmodifiable view is to be returned
3087    * @return an unmodifiable view of the specified navigable map
3088    * @since 12.0
3089    */
3090   @GwtIncompatible("NavigableMap")
3091   public static <K, V> NavigableMap<K, V> unmodifiableNavigableMap(NavigableMap<K, V> map) {
3092     checkNotNull(map);
3093     if (map instanceof UnmodifiableNavigableMap) {
3094       return map;
3095     } else {
3096       return new UnmodifiableNavigableMap<K, V>(map);
3097     }
3098   }
3099 
3100   @Nullable private static <K, V> Entry<K, V> unmodifiableOrNull(@Nullable Entry<K, V> entry) {
3101     return (entry == null) ? null : Maps.unmodifiableEntry(entry);
3102   }
3103 
3104   @GwtIncompatible("NavigableMap")
3105   static class UnmodifiableNavigableMap<K, V>
3106       extends ForwardingSortedMap<K, V> implements NavigableMap<K, V>, Serializable {
3107     private final NavigableMap<K, V> delegate;
3108 
3109     UnmodifiableNavigableMap(NavigableMap<K, V> delegate) {
3110       this.delegate = delegate;
3111     }
3112 
3113     UnmodifiableNavigableMap(
3114         NavigableMap<K, V> delegate, UnmodifiableNavigableMap<K, V> descendingMap) {
3115       this.delegate = delegate;
3116       this.descendingMap = descendingMap;
3117     }
3118 
3119     @Override
3120     protected SortedMap<K, V> delegate() {
3121       return Collections.unmodifiableSortedMap(delegate);
3122     }
3123 
3124     @Override
3125     public Entry<K, V> lowerEntry(K key) {
3126       return unmodifiableOrNull(delegate.lowerEntry(key));
3127     }
3128 
3129     @Override
3130     public K lowerKey(K key) {
3131       return delegate.lowerKey(key);
3132     }
3133 
3134     @Override
3135     public Entry<K, V> floorEntry(K key) {
3136       return unmodifiableOrNull(delegate.floorEntry(key));
3137     }
3138 
3139     @Override
3140     public K floorKey(K key) {
3141       return delegate.floorKey(key);
3142     }
3143 
3144     @Override
3145     public Entry<K, V> ceilingEntry(K key) {
3146       return unmodifiableOrNull(delegate.ceilingEntry(key));
3147     }
3148 
3149     @Override
3150     public K ceilingKey(K key) {
3151       return delegate.ceilingKey(key);
3152     }
3153 
3154     @Override
3155     public Entry<K, V> higherEntry(K key) {
3156       return unmodifiableOrNull(delegate.higherEntry(key));
3157     }
3158 
3159     @Override
3160     public K higherKey(K key) {
3161       return delegate.higherKey(key);
3162     }
3163 
3164     @Override
3165     public Entry<K, V> firstEntry() {
3166       return unmodifiableOrNull(delegate.firstEntry());
3167     }
3168 
3169     @Override
3170     public Entry<K, V> lastEntry() {
3171       return unmodifiableOrNull(delegate.lastEntry());
3172     }
3173 
3174     @Override
3175     public final Entry<K, V> pollFirstEntry() {
3176       throw new UnsupportedOperationException();
3177     }
3178 
3179     @Override
3180     public final Entry<K, V> pollLastEntry() {
3181       throw new UnsupportedOperationException();
3182     }
3183 
3184     private transient UnmodifiableNavigableMap<K, V> descendingMap;
3185 
3186     @Override
3187     public NavigableMap<K, V> descendingMap() {
3188       UnmodifiableNavigableMap<K, V> result = descendingMap;
3189       return (result == null)
3190           ? descendingMap = new UnmodifiableNavigableMap<K, V>(delegate.descendingMap(), this)
3191           : result;
3192     }
3193 
3194     @Override
3195     public Set<K> keySet() {
3196       return navigableKeySet();
3197     }
3198 
3199     @Override
3200     public NavigableSet<K> navigableKeySet() {
3201       return Sets.unmodifiableNavigableSet(delegate.navigableKeySet());
3202     }
3203 
3204     @Override
3205     public NavigableSet<K> descendingKeySet() {
3206       return Sets.unmodifiableNavigableSet(delegate.descendingKeySet());
3207     }
3208 
3209     @Override
3210     public SortedMap<K, V> subMap(K fromKey, K toKey) {
3211       return subMap(fromKey, true, toKey, false);
3212     }
3213 
3214     @Override
3215     public SortedMap<K, V> headMap(K toKey) {
3216       return headMap(toKey, false);
3217     }
3218 
3219     @Override
3220     public SortedMap<K, V> tailMap(K fromKey) {
3221       return tailMap(fromKey, true);
3222     }
3223 
3224     @Override
3225     public
3226         NavigableMap<K, V>
3227         subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
3228       return Maps.unmodifiableNavigableMap(delegate.subMap(
3229           fromKey,
3230           fromInclusive,
3231           toKey,
3232           toInclusive));
3233     }
3234 
3235     @Override
3236     public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
3237       return Maps.unmodifiableNavigableMap(delegate.headMap(toKey, inclusive));
3238     }
3239 
3240     @Override
3241     public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
3242       return Maps.unmodifiableNavigableMap(delegate.tailMap(fromKey, inclusive));
3243     }
3244   }
3245 
3246   /**
3247    * Returns a synchronized (thread-safe) navigable map backed by the specified
3248    * navigable map.  In order to guarantee serial access, it is critical that
3249    * <b>all</b> access to the backing navigable map is accomplished
3250    * through the returned navigable map (or its views).
3251    *
3252    * <p>It is imperative that the user manually synchronize on the returned
3253    * navigable map when iterating over any of its collection views, or the
3254    * collections views of any of its {@code descendingMap}, {@code subMap},
3255    * {@code headMap} or {@code tailMap} views. <pre>   {@code
3256    *
3257    *   NavigableMap<K, V> map = synchronizedNavigableMap(new TreeMap<K, V>());
3258    *
3259    *   // Needn't be in synchronized block
3260    *   NavigableSet<K> set = map.navigableKeySet();
3261    *
3262    *   synchronized (map) { // Synchronizing on map, not set!
3263    *     Iterator<K> it = set.iterator(); // Must be in synchronized block
3264    *     while (it.hasNext()) {
3265    *       foo(it.next());
3266    *     }
3267    *   }}</pre>
3268    *
3269    * <p>or: <pre>   {@code
3270    *
3271    *   NavigableMap<K, V> map = synchronizedNavigableMap(new TreeMap<K, V>());
3272    *   NavigableMap<K, V> map2 = map.subMap(foo, false, bar, true);
3273    *
3274    *   // Needn't be in synchronized block
3275    *   NavigableSet<K> set2 = map2.descendingKeySet();
3276    *
3277    *   synchronized (map) { // Synchronizing on map, not map2 or set2!
3278    *     Iterator<K> it = set2.iterator(); // Must be in synchronized block
3279    *     while (it.hasNext()) {
3280    *       foo(it.next());
3281    *     }
3282    *   }}</pre>
3283    *
3284    * <p>Failure to follow this advice may result in non-deterministic behavior.
3285    *
3286    * <p>The returned navigable map will be serializable if the specified
3287    * navigable map is serializable.
3288    *
3289    * @param navigableMap the navigable map to be "wrapped" in a synchronized
3290    *    navigable map.
3291    * @return a synchronized view of the specified navigable map.
3292    * @since 13.0
3293    */
3294   @GwtIncompatible("NavigableMap")
3295   public static <K, V> NavigableMap<K, V> synchronizedNavigableMap(
3296       NavigableMap<K, V> navigableMap) {
3297     return Synchronized.navigableMap(navigableMap);
3298   }
3299 
3300   /**
3301    * {@code AbstractMap} extension that implements {@link #isEmpty()} as {@code
3302    * entrySet().isEmpty()} instead of {@code size() == 0} to speed up
3303    * implementations where {@code size()} is O(n), and it delegates the {@code
3304    * isEmpty()} methods of its key set and value collection to this
3305    * implementation.
3306    */
3307   @GwtCompatible
3308   abstract static class ImprovedAbstractMap<K, V> extends AbstractMap<K, V> {
3309     /**
3310      * Creates the entry set to be returned by {@link #entrySet()}. This method
3311      * is invoked at most once on a given map, at the time when {@code entrySet}
3312      * is first called.
3313      */
3314     abstract Set<Entry<K, V>> createEntrySet();
3315 
3316     private transient Set<Entry<K, V>> entrySet;
3317 
3318     @Override public Set<Entry<K, V>> entrySet() {
3319       Set<Entry<K, V>> result = entrySet;
3320       return (result == null) ? entrySet = createEntrySet() : result;
3321     }
3322 
3323     private transient Set<K> keySet;
3324 
3325     @Override public Set<K> keySet() {
3326       Set<K> result = keySet;
3327       return (result == null) ? keySet = createKeySet() : result;
3328     }
3329 
3330     Set<K> createKeySet() {
3331       return new KeySet<K, V>(this);
3332     }
3333 
3334     private transient Collection<V> values;
3335 
3336     @Override public Collection<V> values() {
3337       Collection<V> result = values;
3338       return (result == null) ? values = createValues() : result;
3339     }
3340 
3341     Collection<V> createValues() {
3342       return new Values<K, V>(this);
3343     }
3344   }
3345 
3346   /**
3347    * Delegates to {@link Map#get}. Returns {@code null} on {@code
3348    * ClassCastException} and {@code NullPointerException}.
3349    */
3350   static <V> V safeGet(Map<?, V> map, @Nullable Object key) {
3351     checkNotNull(map);
3352     try {
3353       return map.get(key);
3354     } catch (ClassCastException e) {
3355       return null;
3356     } catch (NullPointerException e) {
3357       return null;
3358     }
3359   }
3360 
3361   /**
3362    * Delegates to {@link Map#containsKey}. Returns {@code false} on {@code
3363    * ClassCastException} and {@code NullPointerException}.
3364    */
3365   static boolean safeContainsKey(Map<?, ?> map, Object key) {
3366     checkNotNull(map);
3367     try {
3368       return map.containsKey(key);
3369     } catch (ClassCastException e) {
3370       return false;
3371     } catch (NullPointerException e) {
3372       return false;
3373     }
3374   }
3375 
3376   /**
3377    * Delegates to {@link Map#remove}. Returns {@code null} on {@code
3378    * ClassCastException} and {@code NullPointerException}.
3379    */
3380   static <V> V safeRemove(Map<?, V> map, Object key) {
3381     checkNotNull(map);
3382     try {
3383       return map.remove(key);
3384     } catch (ClassCastException e) {
3385       return null;
3386     } catch (NullPointerException e) {
3387       return null;
3388     }
3389   }
3390 
3391   /**
3392    * An admittedly inefficient implementation of {@link Map#containsKey}.
3393    */
3394   static boolean containsKeyImpl(Map<?, ?> map, @Nullable Object key) {
3395     return Iterators.contains(keyIterator(map.entrySet().iterator()), key);
3396   }
3397 
3398   /**
3399    * An implementation of {@link Map#containsValue}.
3400    */
3401   static boolean containsValueImpl(Map<?, ?> map, @Nullable Object value) {
3402     return Iterators.contains(valueIterator(map.entrySet().iterator()), value);
3403   }
3404 
3405   /**
3406    * Implements {@code Collection.contains} safely for forwarding collections of
3407    * map entries. If {@code o} is an instance of {@code Map.Entry}, it is
3408    * wrapped using {@link #unmodifiableEntry} to protect against a possible
3409    * nefarious equals method.
3410    *
3411    * <p>Note that {@code c} is the backing (delegate) collection, rather than
3412    * the forwarding collection.
3413    *
3414    * @param c the delegate (unwrapped) collection of map entries
3415    * @param o the object that might be contained in {@code c}
3416    * @return {@code true} if {@code c} contains {@code o}
3417    */
3418   static <K, V> boolean containsEntryImpl(Collection<Entry<K, V>> c, Object o) {
3419     if (!(o instanceof Entry)) {
3420       return false;
3421     }
3422     return c.contains(unmodifiableEntry((Entry<?, ?>) o));
3423   }
3424 
3425   /**
3426    * Implements {@code Collection.remove} safely for forwarding collections of
3427    * map entries. If {@code o} is an instance of {@code Map.Entry}, it is
3428    * wrapped using {@link #unmodifiableEntry} to protect against a possible
3429    * nefarious equals method.
3430    *
3431    * <p>Note that {@code c} is backing (delegate) collection, rather than the
3432    * forwarding collection.
3433    *
3434    * @param c the delegate (unwrapped) collection of map entries
3435    * @param o the object to remove from {@code c}
3436    * @return {@code true} if {@code c} was changed
3437    */
3438   static <K, V> boolean removeEntryImpl(Collection<Entry<K, V>> c, Object o) {
3439     if (!(o instanceof Entry)) {
3440       return false;
3441     }
3442     return c.remove(unmodifiableEntry((Entry<?, ?>) o));
3443   }
3444 
3445   /**
3446    * An implementation of {@link Map#equals}.
3447    */
3448   static boolean equalsImpl(Map<?, ?> map, Object object) {
3449     if (map == object) {
3450       return true;
3451     } else if (object instanceof Map) {
3452       Map<?, ?> o = (Map<?, ?>) object;
3453       return map.entrySet().equals(o.entrySet());
3454     }
3455     return false;
3456   }
3457 
3458   static final MapJoiner STANDARD_JOINER =
3459       Collections2.STANDARD_JOINER.withKeyValueSeparator("=");
3460 
3461   /**
3462    * An implementation of {@link Map#toString}.
3463    */
3464   static String toStringImpl(Map<?, ?> map) {
3465     StringBuilder sb
3466         = Collections2.newStringBuilderForCollection(map.size()).append('{');
3467     STANDARD_JOINER.appendTo(sb, map);
3468     return sb.append('}').toString();
3469   }
3470 
3471   /**
3472    * An implementation of {@link Map#putAll}.
3473    */
3474   static <K, V> void putAllImpl(
3475       Map<K, V> self, Map<? extends K, ? extends V> map) {
3476     for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
3477       self.put(entry.getKey(), entry.getValue());
3478     }
3479   }
3480 
3481   static class KeySet<K, V> extends Sets.ImprovedAbstractSet<K> {
3482     final Map<K, V> map;
3483 
3484     KeySet(Map<K, V> map) {
3485       this.map = checkNotNull(map);
3486     }
3487 
3488     Map<K, V> map() {
3489       return map;
3490     }
3491 
3492     @Override public Iterator<K> iterator() {
3493       return keyIterator(map().entrySet().iterator());
3494     }
3495 
3496     @Override public int size() {
3497       return map().size();
3498     }
3499 
3500     @Override public boolean isEmpty() {
3501       return map().isEmpty();
3502     }
3503 
3504     @Override public boolean contains(Object o) {
3505       return map().containsKey(o);
3506     }
3507 
3508     @Override public boolean remove(Object o) {
3509       if (contains(o)) {
3510         map().remove(o);
3511         return true;
3512       }
3513       return false;
3514     }
3515 
3516     @Override public void clear() {
3517       map().clear();
3518     }
3519   }
3520 
3521   @Nullable
3522   static <K> K keyOrNull(@Nullable Entry<K, ?> entry) {
3523     return (entry == null) ? null : entry.getKey();
3524   }
3525 
3526   @Nullable
3527   static <V> V valueOrNull(@Nullable Entry<?, V> entry) {
3528     return (entry == null) ? null : entry.getValue();
3529   }
3530 
3531   static class SortedKeySet<K, V> extends KeySet<K, V> implements SortedSet<K> {
3532     SortedKeySet(SortedMap<K, V> map) {
3533       super(map);
3534     }
3535 
3536     @Override
3537     SortedMap<K, V> map() {
3538       return (SortedMap<K, V>) super.map();
3539     }
3540 
3541     @Override
3542     public Comparator<? super K> comparator() {
3543       return map().comparator();
3544     }
3545 
3546     @Override
3547     public SortedSet<K> subSet(K fromElement, K toElement) {
3548       return new SortedKeySet<K, V>(map().subMap(fromElement, toElement));
3549     }
3550 
3551     @Override
3552     public SortedSet<K> headSet(K toElement) {
3553       return new SortedKeySet<K, V>(map().headMap(toElement));
3554     }
3555 
3556     @Override
3557     public SortedSet<K> tailSet(K fromElement) {
3558       return new SortedKeySet<K, V>(map().tailMap(fromElement));
3559     }
3560 
3561     @Override
3562     public K first() {
3563       return map().firstKey();
3564     }
3565 
3566     @Override
3567     public K last() {
3568       return map().lastKey();
3569     }
3570   }
3571 
3572   @GwtIncompatible("NavigableMap")
3573   static class NavigableKeySet<K, V> extends SortedKeySet<K, V> implements NavigableSet<K> {
3574     NavigableKeySet(NavigableMap<K, V> map) {
3575       super(map);
3576     }
3577 
3578     @Override
3579     NavigableMap<K, V> map() {
3580       return (NavigableMap<K, V>) map;
3581     }
3582 
3583     @Override
3584     public K lower(K e) {
3585       return map().lowerKey(e);
3586     }
3587 
3588     @Override
3589     public K floor(K e) {
3590       return map().floorKey(e);
3591     }
3592 
3593     @Override
3594     public K ceiling(K e) {
3595       return map().ceilingKey(e);
3596     }
3597 
3598     @Override
3599     public K higher(K e) {
3600       return map().higherKey(e);
3601     }
3602 
3603     @Override
3604     public K pollFirst() {
3605       return keyOrNull(map().pollFirstEntry());
3606     }
3607 
3608     @Override
3609     public K pollLast() {
3610       return keyOrNull(map().pollLastEntry());
3611     }
3612 
3613     @Override
3614     public NavigableSet<K> descendingSet() {
3615       return map().descendingKeySet();
3616     }
3617 
3618     @Override
3619     public Iterator<K> descendingIterator() {
3620       return descendingSet().iterator();
3621     }
3622 
3623     @Override
3624     public NavigableSet<K> subSet(
3625         K fromElement,
3626         boolean fromInclusive,
3627         K toElement,
3628         boolean toInclusive) {
3629       return map().subMap(fromElement, fromInclusive, toElement, toInclusive).navigableKeySet();
3630     }
3631 
3632     @Override
3633     public NavigableSet<K> headSet(K toElement, boolean inclusive) {
3634       return map().headMap(toElement, inclusive).navigableKeySet();
3635     }
3636 
3637     @Override
3638     public NavigableSet<K> tailSet(K fromElement, boolean inclusive) {
3639       return map().tailMap(fromElement, inclusive).navigableKeySet();
3640     }
3641 
3642     @Override
3643     public SortedSet<K> subSet(K fromElement, K toElement) {
3644       return subSet(fromElement, true, toElement, false);
3645     }
3646 
3647     @Override
3648     public SortedSet<K> headSet(K toElement) {
3649       return headSet(toElement, false);
3650     }
3651 
3652     @Override
3653     public SortedSet<K> tailSet(K fromElement) {
3654       return tailSet(fromElement, true);
3655     }
3656   }
3657 
3658   static class Values<K, V> extends AbstractCollection<V> {
3659     final Map<K, V> map;
3660 
3661     Values(Map<K, V> map) {
3662       this.map = checkNotNull(map);
3663     }
3664 
3665     final Map<K, V> map() {
3666       return map;
3667     }
3668 
3669     @Override public Iterator<V> iterator() {
3670       return valueIterator(map().entrySet().iterator());
3671     }
3672 
3673     @Override public boolean remove(Object o) {
3674       try {
3675         return super.remove(o);
3676       } catch (UnsupportedOperationException e) {
3677         for (Entry<K, V> entry : map().entrySet()) {
3678           if (Objects.equal(o, entry.getValue())) {
3679             map().remove(entry.getKey());
3680             return true;
3681           }
3682         }
3683         return false;
3684       }
3685     }
3686 
3687     @Override public boolean removeAll(Collection<?> c) {
3688       try {
3689         return super.removeAll(checkNotNull(c));
3690       } catch (UnsupportedOperationException e) {
3691         Set<K> toRemove = Sets.newHashSet();
3692         for (Entry<K, V> entry : map().entrySet()) {
3693           if (c.contains(entry.getValue())) {
3694             toRemove.add(entry.getKey());
3695           }
3696         }
3697         return map().keySet().removeAll(toRemove);
3698       }
3699     }
3700 
3701     @Override public boolean retainAll(Collection<?> c) {
3702       try {
3703         return super.retainAll(checkNotNull(c));
3704       } catch (UnsupportedOperationException e) {
3705         Set<K> toRetain = Sets.newHashSet();
3706         for (Entry<K, V> entry : map().entrySet()) {
3707           if (c.contains(entry.getValue())) {
3708             toRetain.add(entry.getKey());
3709           }
3710         }
3711         return map().keySet().retainAll(toRetain);
3712       }
3713     }
3714 
3715     @Override public int size() {
3716       return map().size();
3717     }
3718 
3719     @Override public boolean isEmpty() {
3720       return map().isEmpty();
3721     }
3722 
3723     @Override public boolean contains(@Nullable Object o) {
3724       return map().containsValue(o);
3725     }
3726 
3727     @Override public void clear() {
3728       map().clear();
3729     }
3730   }
3731 
3732   abstract static class EntrySet<K, V>
3733       extends Sets.ImprovedAbstractSet<Entry<K, V>> {
3734     abstract Map<K, V> map();
3735 
3736     @Override public int size() {
3737       return map().size();
3738     }
3739 
3740     @Override public void clear() {
3741       map().clear();
3742     }
3743 
3744     @Override public boolean contains(Object o) {
3745       if (o instanceof Entry) {
3746         Entry<?, ?> entry = (Entry<?, ?>) o;
3747         Object key = entry.getKey();
3748         V value = Maps.safeGet(map(), key);
3749         return Objects.equal(value, entry.getValue())
3750             && (value != null || map().containsKey(key));
3751       }
3752       return false;
3753     }
3754 
3755     @Override public boolean isEmpty() {
3756       return map().isEmpty();
3757     }
3758 
3759     @Override public boolean remove(Object o) {
3760       if (contains(o)) {
3761         Entry<?, ?> entry = (Entry<?, ?>) o;
3762         return map().keySet().remove(entry.getKey());
3763       }
3764       return false;
3765     }
3766 
3767     @Override public boolean removeAll(Collection<?> c) {
3768       try {
3769         return super.removeAll(checkNotNull(c));
3770       } catch (UnsupportedOperationException e) {
3771         // if the iterators don't support remove
3772         return Sets.removeAllImpl(this, c.iterator());
3773       }
3774     }
3775 
3776     @Override public boolean retainAll(Collection<?> c) {
3777       try {
3778         return super.retainAll(checkNotNull(c));
3779       } catch (UnsupportedOperationException e) {
3780         // if the iterators don't support remove
3781         Set<Object> keys = Sets.newHashSetWithExpectedSize(c.size());
3782         for (Object o : c) {
3783           if (contains(o)) {
3784             Entry<?, ?> entry = (Entry<?, ?>) o;
3785             keys.add(entry.getKey());
3786           }
3787         }
3788         return map().keySet().retainAll(keys);
3789       }
3790     }
3791   }
3792 
3793   @GwtIncompatible("NavigableMap")
3794   abstract static class DescendingMap<K, V> extends ForwardingMap<K, V>
3795       implements NavigableMap<K, V> {
3796 
3797     abstract NavigableMap<K, V> forward();
3798 
3799     @Override
3800     protected final Map<K, V> delegate() {
3801       return forward();
3802     }
3803 
3804     private transient Comparator<? super K> comparator;
3805 
3806     @SuppressWarnings("unchecked")
3807     @Override
3808     public Comparator<? super K> comparator() {
3809       Comparator<? super K> result = comparator;
3810       if (result == null) {
3811         Comparator<? super K> forwardCmp = forward().comparator();
3812         if (forwardCmp == null) {
3813           forwardCmp = (Comparator) Ordering.natural();
3814         }
3815         result = comparator = reverse(forwardCmp);
3816       }
3817       return result;
3818     }
3819 
3820     // If we inline this, we get a javac error.
3821     private static <T> Ordering<T> reverse(Comparator<T> forward) {
3822       return Ordering.from(forward).reverse();
3823     }
3824 
3825     @Override
3826     public K firstKey() {
3827       return forward().lastKey();
3828     }
3829 
3830     @Override
3831     public K lastKey() {
3832       return forward().firstKey();
3833     }
3834 
3835     @Override
3836     public Entry<K, V> lowerEntry(K key) {
3837       return forward().higherEntry(key);
3838     }
3839 
3840     @Override
3841     public K lowerKey(K key) {
3842       return forward().higherKey(key);
3843     }
3844 
3845     @Override
3846     public Entry<K, V> floorEntry(K key) {
3847       return forward().ceilingEntry(key);
3848     }
3849 
3850     @Override
3851     public K floorKey(K key) {
3852       return forward().ceilingKey(key);
3853     }
3854 
3855     @Override
3856     public Entry<K, V> ceilingEntry(K key) {
3857       return forward().floorEntry(key);
3858     }
3859 
3860     @Override
3861     public K ceilingKey(K key) {
3862       return forward().floorKey(key);
3863     }
3864 
3865     @Override
3866     public Entry<K, V> higherEntry(K key) {
3867       return forward().lowerEntry(key);
3868     }
3869 
3870     @Override
3871     public K higherKey(K key) {
3872       return forward().lowerKey(key);
3873     }
3874 
3875     @Override
3876     public Entry<K, V> firstEntry() {
3877       return forward().lastEntry();
3878     }
3879 
3880     @Override
3881     public Entry<K, V> lastEntry() {
3882       return forward().firstEntry();
3883     }
3884 
3885     @Override
3886     public Entry<K, V> pollFirstEntry() {
3887       return forward().pollLastEntry();
3888     }
3889 
3890     @Override
3891     public Entry<K, V> pollLastEntry() {
3892       return forward().pollFirstEntry();
3893     }
3894 
3895     @Override
3896     public NavigableMap<K, V> descendingMap() {
3897       return forward();
3898     }
3899 
3900     private transient Set<Entry<K, V>> entrySet;
3901 
3902     @Override
3903     public Set<Entry<K, V>> entrySet() {
3904       Set<Entry<K, V>> result = entrySet;
3905       return (result == null) ? entrySet = createEntrySet() : result;
3906     }
3907 
3908     abstract Iterator<Entry<K, V>> entryIterator();
3909 
3910     Set<Entry<K, V>> createEntrySet() {
3911       return new EntrySet<K, V>() {
3912         @Override
3913         Map<K, V> map() {
3914           return DescendingMap.this;
3915         }
3916 
3917         @Override
3918         public Iterator<Entry<K, V>> iterator() {
3919           return entryIterator();
3920         }
3921       };
3922     }
3923 
3924     @Override
3925     public Set<K> keySet() {
3926       return navigableKeySet();
3927     }
3928 
3929     private transient NavigableSet<K> navigableKeySet;
3930 
3931     @Override
3932     public NavigableSet<K> navigableKeySet() {
3933       NavigableSet<K> result = navigableKeySet;
3934       return (result == null) ? navigableKeySet = new NavigableKeySet<K, V>(this) : result;
3935     }
3936 
3937     @Override
3938     public NavigableSet<K> descendingKeySet() {
3939       return forward().navigableKeySet();
3940     }
3941 
3942     @Override
3943     public
3944     NavigableMap<K, V>
3945     subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
3946       return forward().subMap(toKey, toInclusive, fromKey, fromInclusive).descendingMap();
3947     }
3948 
3949     @Override
3950     public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
3951       return forward().tailMap(toKey, inclusive).descendingMap();
3952     }
3953 
3954     @Override
3955     public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
3956       return forward().headMap(fromKey, inclusive).descendingMap();
3957     }
3958 
3959     @Override
3960     public SortedMap<K, V> subMap(K fromKey, K toKey) {
3961       return subMap(fromKey, true, toKey, false);
3962     }
3963 
3964     @Override
3965     public SortedMap<K, V> headMap(K toKey) {
3966       return headMap(toKey, false);
3967     }
3968 
3969     @Override
3970     public SortedMap<K, V> tailMap(K fromKey) {
3971       return tailMap(fromKey, true);
3972     }
3973 
3974     @Override
3975     public Collection<V> values() {
3976       return new Values<K, V>(this);
3977     }
3978 
3979     @Override
3980     public String toString() {
3981       return standardToString();
3982     }
3983   }
3984 }