11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkArgument; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull; 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Predicates.compose; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Predicates.equalTo; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Predicates.in; 240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Predicates.not; 250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.CollectPreconditions.checkNonnegative; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible; 300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.base.Converter; 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Equivalence; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Function; 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Joiner.MapJoiner; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Objects; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Preconditions; 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicate; 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicates; 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.MapDifference.ValueDifference; 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.primitives.Ints; 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable; 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.AbstractCollection; 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.AbstractMap; 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections; 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator; 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.EnumMap; 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Enumeration; 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashMap; 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.IdentityHashMap; 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashMap; 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map; 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry; 553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.NavigableMap; 563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.NavigableSet; 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Properties; 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedMap; 607dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.SortedSet; 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.TreeMap; 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ConcurrentMap; 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 677dd252788645e940eada959bdde927426e2531c9Paul Duffin * Static utility methods pertaining to {@link Map} instances (including instances of 687dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@link SortedMap}, {@link BiMap}, etc.). Also see this class's counterparts 697dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@link Lists}, {@link Sets} and {@link Queues}. 707dd252788645e940eada959bdde927426e2531c9Paul Duffin * 717dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>See the Guava User Guide article on <a href= 727dd252788645e940eada959bdde927426e2531c9Paul Duffin * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Maps"> 737dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code Maps}</a>. 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Isaac Shum 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library) 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class Maps { 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Maps() {} 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin private enum EntryFunction implements Function<Entry<?, ?>, Object> { 867dd252788645e940eada959bdde927426e2531c9Paul Duffin KEY { 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 887dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Object apply(Entry<?, ?> entry) { 907dd252788645e940eada959bdde927426e2531c9Paul Duffin return entry.getKey(); 917dd252788645e940eada959bdde927426e2531c9Paul Duffin } 927dd252788645e940eada959bdde927426e2531c9Paul Duffin }, 937dd252788645e940eada959bdde927426e2531c9Paul Duffin VALUE { 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 957dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Object apply(Entry<?, ?> entry) { 977dd252788645e940eada959bdde927426e2531c9Paul Duffin return entry.getValue(); 987dd252788645e940eada959bdde927426e2531c9Paul Duffin } 997dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 1007dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1017dd252788645e940eada959bdde927426e2531c9Paul Duffin 1027dd252788645e940eada959bdde927426e2531c9Paul Duffin @SuppressWarnings("unchecked") 1037dd252788645e940eada959bdde927426e2531c9Paul Duffin static <K> Function<Entry<K, ?>, K> keyFunction() { 1047dd252788645e940eada959bdde927426e2531c9Paul Duffin return (Function) EntryFunction.KEY; 1057dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1067dd252788645e940eada959bdde927426e2531c9Paul Duffin 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 1087dd252788645e940eada959bdde927426e2531c9Paul Duffin static <V> Function<Entry<?, V>, V> valueFunction() { 1097dd252788645e940eada959bdde927426e2531c9Paul Duffin return (Function) EntryFunction.VALUE; 1107dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1117dd252788645e940eada959bdde927426e2531c9Paul Duffin 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> Iterator<K> keyIterator(Iterator<Entry<K, V>> entryIterator) { 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Iterators.transform(entryIterator, Maps.<K>keyFunction()); 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> Iterator<V> valueIterator(Iterator<Entry<K, V>> entryIterator) { 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Iterators.transform(entryIterator, Maps.<V>valueFunction()); 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> UnmodifiableIterator<V> valueIterator( 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin final UnmodifiableIterator<Entry<K, V>> entryIterator) { 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new UnmodifiableIterator<V>() { 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean hasNext() { 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin return entryIterator.hasNext(); 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin public V next() { 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin return entryIterator.next().getValue(); 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1357dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 1367dd252788645e940eada959bdde927426e2531c9Paul Duffin * Returns an immutable map instance containing the given entries. 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Internally, the returned map will be backed by an {@link EnumMap}. 1387dd252788645e940eada959bdde927426e2531c9Paul Duffin * 1397dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The iteration order of the returned map follows the enum's iteration 1407dd252788645e940eada959bdde927426e2531c9Paul Duffin * order, not the order in which the elements appear in the given map. 1417dd252788645e940eada959bdde927426e2531c9Paul Duffin * 1427dd252788645e940eada959bdde927426e2531c9Paul Duffin * @param map the map to make an immutable copy of 1437dd252788645e940eada959bdde927426e2531c9Paul Duffin * @return an immutable map containing those entries 1447dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 14.0 1457dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 1467dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtCompatible(serializable = true) 1477dd252788645e940eada959bdde927426e2531c9Paul Duffin @Beta 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K extends Enum<K>, V> ImmutableMap<K, V> immutableEnumMap( 1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, ? extends V> map) { 1507dd252788645e940eada959bdde927426e2531c9Paul Duffin if (map instanceof ImmutableEnumMap) { 1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") // safe covariant cast 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin ImmutableEnumMap<K, V> result = (ImmutableEnumMap<K, V>) map; 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin return result; 1547dd252788645e940eada959bdde927426e2531c9Paul Duffin } else if (map.isEmpty()) { 1557dd252788645e940eada959bdde927426e2531c9Paul Duffin return ImmutableMap.of(); 1567dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (Map.Entry<K, ? extends V> entry : map.entrySet()) { 1587dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(entry.getKey()); 1597dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(entry.getValue()); 1607dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1617dd252788645e940eada959bdde927426e2531c9Paul Duffin return ImmutableEnumMap.asImmutable(new EnumMap<K, V>(map)); 1627dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1637dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1647dd252788645e940eada959bdde927426e2531c9Paul Duffin 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i>, empty {@code HashMap} instance. 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required, use {@link 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableMap#of()} instead. 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #newEnumMap} instead. 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code HashMap} 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <K, V> HashMap<K, V> newHashMap() { 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new HashMap<K, V>(); 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a {@code HashMap} instance, with a high enough "initial capacity" 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that it <i>should</i> hold {@code expectedSize} elements without growth. 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * This behavior cannot be broadly guaranteed, but it is observed to be true 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * for OpenJDK 1.6. It also can't be guaranteed that the method isn't 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * inadvertently <i>oversizing</i> the returned map. 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param expectedSize the number of elements you expect to add to the 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * returned map 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code HashMap} with enough capacity to hold {@code 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * expectedSize} elements without resizing 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code expectedSize} is negative 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> HashMap<K, V> newHashMapWithExpectedSize( 1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin int expectedSize) { 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new HashMap<K, V>(capacity(expectedSize)); 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a capacity that is sufficient to keep the map from being resized as 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * long as it grows no larger than expectedSize and the load factor is >= its 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * default (0.75). 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static int capacity(int expectedSize) { 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (expectedSize < 3) { 2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNonnegative(expectedSize, "expectedSize"); 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return expectedSize + 1; 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (expectedSize < Ints.MAX_POWER_OF_TWO) { 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return expectedSize + expectedSize / 3; 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Integer.MAX_VALUE; // any large value 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i> {@code HashMap} instance with the same mappings as 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the specified map. 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required, use {@link 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableMap#copyOf(Map)} instead. 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if {@code K} is an {@link Enum} type, use {@link 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * #newEnumMap} instead. 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param map the mappings to be placed in the new map 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new {@code HashMap} initialized with the mappings from {@code 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * map} 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> HashMap<K, V> newHashMap( 2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<? extends K, ? extends V> map) { 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new HashMap<K, V>(map); 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i>, empty, insertion-ordered {@code LinkedHashMap} 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * instance. 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required, use {@link 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableMap#of()} instead. 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code LinkedHashMap} 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <K, V> LinkedHashMap<K, V> newLinkedHashMap() { 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new LinkedHashMap<K, V>(); 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i>, insertion-ordered {@code LinkedHashMap} instance 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * with the same mappings as the specified map. 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required, use {@link 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableMap#copyOf(Map)} instead. 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param map the mappings to be placed in the new map 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, {@code LinkedHashMap} initialized with the mappings from 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code map} 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> LinkedHashMap<K, V> newLinkedHashMap( 2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<? extends K, ? extends V> map) { 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new LinkedHashMap<K, V>(map); 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a general-purpose instance of {@code ConcurrentMap}, which supports 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * all optional operations of the ConcurrentMap interface. It does not permit 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * null keys or values. It is serializable. 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This is currently accomplished by calling {@link MapMaker#makeMap()}. 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>It is preferable to use {@code MapMaker} directly (rather than through 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this method), as it presents numerous useful configuration options, 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * such as the concurrency level, load factor, key/value reference types, 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and value computation. 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code ConcurrentMap} 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 3.0 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <K, V> ConcurrentMap<K, V> newConcurrentMap() { 2780888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new MapMaker().<K, V>makeMap(); 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i>, empty {@code TreeMap} instance using the natural 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ordering of its elements. 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required, use {@link 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableSortedMap#of()} instead. 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code TreeMap} 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <K extends Comparable, V> TreeMap<K, V> newTreeMap() { 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new TreeMap<K, V>(); 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i> {@code TreeMap} instance with the same mappings as 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the specified map and using the same ordering as the specified map. 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required, use {@link 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableSortedMap#copyOfSorted(SortedMap)} instead. 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param map the sorted map whose mappings are to be placed in the new map 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and whose comparator is to be used to sort the new map 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new {@code TreeMap} initialized with the mappings from {@code 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * map} and using the comparator of {@code map} 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <K, V> TreeMap<K, V> newTreeMap(SortedMap<K, ? extends V> map) { 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new TreeMap<K, V>(map); 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a <i>mutable</i>, empty {@code TreeMap} instance using the given 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * comparator. 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b> if mutability is not required, use {@code 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ImmutableSortedMap.orderedBy(comparator).build()} instead. 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param comparator the comparator to sort the keys with 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code TreeMap} 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3200888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <C, K extends C, V> TreeMap<K, V> newTreeMap( 3210888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Nullable Comparator<C> comparator) { 3227dd252788645e940eada959bdde927426e2531c9Paul Duffin // Ideally, the extra type parameter "C" shouldn't be necessary. It is a 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // work-around of a compiler type inference quirk that prevents the 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // following code from being compiled: 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Comparator<Class<?>> comparator = null; 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Map<Class<? extends Throwable>, String> map = newTreeMap(comparator); 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new TreeMap<K, V>(comparator); 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates an {@code EnumMap} instance. 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param type the key type for this map 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code EnumMap} 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(Class<K> type) { 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new EnumMap<K, V>(checkNotNull(type)); 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates an {@code EnumMap} with the same mappings as the specified map. 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param map the map from which to initialize this {@code EnumMap} 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new {@code EnumMap} initialized with the mappings from {@code 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * map} 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws IllegalArgumentException if {@code m} is not an {@code EnumMap} 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * instance and contains no mappings 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3490888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap( 3500888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, ? extends V> map) { 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new EnumMap<K, V>(map); 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates an {@code IdentityHashMap} instance. 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty {@code IdentityHashMap} 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <K, V> IdentityHashMap<K, V> newIdentityHashMap() { 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new IdentityHashMap<K, V>(); 3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Computes the difference between two maps. This difference is an immutable 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * snapshot of the state of the maps at the time this method is called. It 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * will never change, even if the maps change at a later time. 3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Since this method uses {@code HashMap} instances internally, the keys of 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the supplied maps must be well-behaved with respect to 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Object#equals} and {@link Object#hashCode}. 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b>If you only need to know whether two maps have the same 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * mappings, call {@code left.equals(right)} instead of this method. 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param left the map to treat as the "left" map for purposes of comparison 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param right the map to treat as the "right" map for purposes of comparison 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the difference between the two maps 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 3800888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> MapDifference<K, V> difference( 3810888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) { 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (left instanceof SortedMap) { 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedMap<K, ? extends V> sortedLeft = (SortedMap<K, ? extends V>) left; 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedMapDifference<K, V> result = difference(sortedLeft, right); 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return result; 3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3877dd252788645e940eada959bdde927426e2531c9Paul Duffin return difference(left, right, Equivalence.equals()); 3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Computes the difference between two maps. This difference is an immutable 3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * snapshot of the state of the maps at the time this method is called. It 3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * will never change, even if the maps change at a later time. 3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Values are compared using a provided equivalence, in the case of 3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * equality, the value on the 'left' is returned in the difference. 3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Since this method uses {@code HashMap} instances internally, the keys of 3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the supplied maps must be well-behaved with respect to 4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Object#equals} and {@link Object#hashCode}. 4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param left the map to treat as the "left" map for purposes of comparison 4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param right the map to treat as the "right" map for purposes of comparison 4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param valueEquivalence the equivalence relationship to use to compare 4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values 4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the difference between the two maps 4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0 4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Beta 4100888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> MapDifference<K, V> difference( 4110888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right, 4120888a09821a98ac0680fad765217302858e70fa4Paul Duffin Equivalence<? super V> valueEquivalence) { 4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Preconditions.checkNotNull(valueEquivalence); 4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<K, V> onlyOnLeft = newHashMap(); 4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<K, V> onlyOnRight = new HashMap<K, V>(right); // will whittle it down 4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<K, V> onBoth = newHashMap(); 4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<K, MapDifference.ValueDifference<V>> differences = newHashMap(); 4190888a09821a98ac0680fad765217302858e70fa4Paul Duffin doDifference(left, right, valueEquivalence, onlyOnLeft, onlyOnRight, onBoth, differences); 4200888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new MapDifferenceImpl<K, V>(onlyOnLeft, onlyOnRight, onBoth, differences); 4210888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4230888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <K, V> void doDifference( 4240888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right, 4250888a09821a98ac0680fad765217302858e70fa4Paul Duffin Equivalence<? super V> valueEquivalence, 4260888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> onlyOnLeft, Map<K, V> onlyOnRight, Map<K, V> onBoth, 4270888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, MapDifference.ValueDifference<V>> differences) { 4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<? extends K, ? extends V> entry : left.entrySet()) { 4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K leftKey = entry.getKey(); 4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V leftValue = entry.getValue(); 4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (right.containsKey(leftKey)) { 4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V rightValue = onlyOnRight.remove(leftKey); 4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (valueEquivalence.equivalent(leftValue, rightValue)) { 4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert onBoth.put(leftKey, leftValue); 4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 4360888a09821a98ac0680fad765217302858e70fa4Paul Duffin differences.put( 4370888a09821a98ac0680fad765217302858e70fa4Paul Duffin leftKey, ValueDifferenceImpl.create(leftValue, rightValue)); 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert onlyOnLeft.put(leftKey, leftValue); 4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4450888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <K, V> Map<K, V> unmodifiableMap(Map<K, V> map) { 4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (map instanceof SortedMap) { 4470888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Collections.unmodifiableSortedMap((SortedMap<K, ? extends V>) map); 4480888a09821a98ac0680fad765217302858e70fa4Paul Duffin } else { 4490888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Collections.unmodifiableMap(map); 4500888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static class MapDifferenceImpl<K, V> implements MapDifference<K, V> { 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> onlyOnLeft; 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> onlyOnRight; 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> onBoth; 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, ValueDifference<V>> differences; 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4590888a09821a98ac0680fad765217302858e70fa4Paul Duffin MapDifferenceImpl(Map<K, V> onlyOnLeft, 4600888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> onlyOnRight, Map<K, V> onBoth, 4610888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, ValueDifference<V>> differences) { 4620888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.onlyOnLeft = unmodifiableMap(onlyOnLeft); 4630888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.onlyOnRight = unmodifiableMap(onlyOnRight); 4640888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.onBoth = unmodifiableMap(onBoth); 4650888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.differences = unmodifiableMap(differences); 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4680888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean areEqual() { 4700888a09821a98ac0680fad765217302858e70fa4Paul Duffin return onlyOnLeft.isEmpty() && onlyOnRight.isEmpty() && differences.isEmpty(); 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4730888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Map<K, V> entriesOnlyOnLeft() { 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return onlyOnLeft; 4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4780888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Map<K, V> entriesOnlyOnRight() { 4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return onlyOnRight; 4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4830888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Map<K, V> entriesInCommon() { 4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return onBoth; 4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4880888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Map<K, ValueDifference<V>> entriesDiffering() { 4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return differences; 4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4930888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean equals(Object object) { 4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (object == this) { 4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (object instanceof MapDifference) { 4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert MapDifference<?, ?> other = (MapDifference<?, ?>) object; 4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return entriesOnlyOnLeft().equals(other.entriesOnlyOnLeft()) 5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && entriesOnlyOnRight().equals(other.entriesOnlyOnRight()) 5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && entriesInCommon().equals(other.entriesInCommon()) 5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && entriesDiffering().equals(other.entriesDiffering()); 5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5070888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int hashCode() { 5080888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Objects.hashCode(entriesOnlyOnLeft(), entriesOnlyOnRight(), 5090888a09821a98ac0680fad765217302858e70fa4Paul Duffin entriesInCommon(), entriesDiffering()); 5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5120888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public String toString() { 5130888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (areEqual()) { 5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "equal"; 5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert StringBuilder result = new StringBuilder("not equal"); 5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!onlyOnLeft.isEmpty()) { 5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result.append(": only on left=").append(onlyOnLeft); 5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!onlyOnRight.isEmpty()) { 5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result.append(": only on right=").append(onlyOnRight); 5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!differences.isEmpty()) { 5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result.append(": value differences=").append(differences); 5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return result.toString(); 5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5310888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class ValueDifferenceImpl<V> 5320888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements MapDifference.ValueDifference<V> { 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final V left; 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final V right; 5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <V> ValueDifference<V> create(@Nullable V left, @Nullable V right) { 5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ValueDifferenceImpl<V>(left, right); 5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private ValueDifferenceImpl(@Nullable V left, @Nullable V right) { 5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.left = left; 5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.right = right; 5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5450888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public V leftValue() { 5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return left; 5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5500888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public V rightValue() { 5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return right; 5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5550888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean equals(@Nullable Object object) { 5567dd252788645e940eada959bdde927426e2531c9Paul Duffin if (object instanceof MapDifference.ValueDifference) { 5570888a09821a98ac0680fad765217302858e70fa4Paul Duffin MapDifference.ValueDifference<?> that = 5580888a09821a98ac0680fad765217302858e70fa4Paul Duffin (MapDifference.ValueDifference<?>) object; 5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Objects.equal(this.left, that.leftValue()) 5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && Objects.equal(this.right, that.rightValue()); 5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5650888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int hashCode() { 5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Objects.hashCode(left, right); 5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5690888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public String toString() { 5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "(" + left + ", " + right + ")"; 5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Computes the difference between two sorted maps, using the comparator of 5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the left map, or {@code Ordering.natural()} if the left map uses the 5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * natural ordering of its elements. This difference is an immutable snapshot 5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * of the state of the maps at the time this method is called. It will never 5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * change, even if the maps change at a later time. 5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Since this method uses {@code TreeMap} instances internally, the keys of 5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the right map must all compare as distinct according to the comparator 5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * of the left map. 5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Note:</b>If you only need to know whether two sorted maps have the 5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * same mappings, call {@code left.equals(right)} instead of this method. 5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param left the map to treat as the "left" map for purposes of comparison 5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param right the map to treat as the "right" map for purposes of comparison 5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return the difference between the two maps 5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 5930888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> SortedMapDifference<K, V> difference( 5940888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, ? extends V> left, Map<? extends K, ? extends V> right) { 5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(left); 5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(right); 5970888a09821a98ac0680fad765217302858e70fa4Paul Duffin Comparator<? super K> comparator = orNaturalOrder(left.comparator()); 5980888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> onlyOnLeft = Maps.newTreeMap(comparator); 5990888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> onlyOnRight = Maps.newTreeMap(comparator); 6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert onlyOnRight.putAll(right); // will whittle it down 6010888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> onBoth = Maps.newTreeMap(comparator); 6020888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, MapDifference.ValueDifference<V>> differences = 6030888a09821a98ac0680fad765217302858e70fa4Paul Duffin Maps.newTreeMap(comparator); 6040888a09821a98ac0680fad765217302858e70fa4Paul Duffin doDifference(left, right, Equivalence.equals(), onlyOnLeft, onlyOnRight, onBoth, differences); 6050888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SortedMapDifferenceImpl<K, V>(onlyOnLeft, onlyOnRight, onBoth, differences); 6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6080888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class SortedMapDifferenceImpl<K, V> extends MapDifferenceImpl<K, V> 6090888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements SortedMapDifference<K, V> { 6100888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMapDifferenceImpl(SortedMap<K, V> onlyOnLeft, 6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedMap<K, V> onlyOnRight, SortedMap<K, V> onBoth, 6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedMap<K, ValueDifference<V>> differences) { 6130888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(onlyOnLeft, onlyOnRight, onBoth, differences); 6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6160888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, ValueDifference<V>> entriesDiffering() { 6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (SortedMap<K, ValueDifference<V>>) super.entriesDiffering(); 6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6200888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V> entriesInCommon() { 6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (SortedMap<K, V>) super.entriesInCommon(); 6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6240888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V> entriesOnlyOnLeft() { 6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (SortedMap<K, V>) super.entriesOnlyOnLeft(); 6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6280888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V> entriesOnlyOnRight() { 6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (SortedMap<K, V>) super.entriesOnlyOnRight(); 6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the specified comparator if not null; otherwise returns {@code 6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Ordering.natural()}. This method is an abomination of generics; the only 6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * purpose of this method is to contain the ugly type-casting in one place. 6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 6390888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <E> Comparator<? super E> orNaturalOrder( 6400888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Nullable Comparator<? super E> comparator) { 6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (comparator != null) { // can't use ? : because of javac bug 5080917 6420888a09821a98ac0680fad765217302858e70fa4Paul Duffin return comparator; 6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (Comparator<E>) Ordering.natural(); 6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6467dd252788645e940eada959bdde927426e2531c9Paul Duffin 6477dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 6480888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns a live {@link Map} view whose keys are the contents of {@code set} 6490888a09821a98ac0680fad765217302858e70fa4Paul Duffin * and whose values are computed on demand using {@code function}. To get an 6500888a09821a98ac0680fad765217302858e70fa4Paul Duffin * immutable <i>copy</i> instead, use {@link #toMap(Iterable, Function)}. 6517dd252788645e940eada959bdde927426e2531c9Paul Duffin * 6527dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Specifically, for each {@code k} in the backing set, the returned map 6537dd252788645e940eada959bdde927426e2531c9Paul Duffin * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code 6547dd252788645e940eada959bdde927426e2531c9Paul Duffin * keySet}, {@code values}, and {@code entrySet} views of the returned map 6557dd252788645e940eada959bdde927426e2531c9Paul Duffin * iterate in the same order as the backing set. 6567dd252788645e940eada959bdde927426e2531c9Paul Duffin * 6577dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Modifications to the backing set are read through to the returned map. 6587dd252788645e940eada959bdde927426e2531c9Paul Duffin * The returned map supports removal operations if the backing set does. 6597dd252788645e940eada959bdde927426e2531c9Paul Duffin * Removal operations write through to the backing set. The returned map 6607dd252788645e940eada959bdde927426e2531c9Paul Duffin * does not support put operations. 6617dd252788645e940eada959bdde927426e2531c9Paul Duffin * 6623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> If the function rejects {@code null}, caution is 6637dd252788645e940eada959bdde927426e2531c9Paul Duffin * required to make sure the set does not contain {@code null}, because the 6647dd252788645e940eada959bdde927426e2531c9Paul Duffin * view cannot stop {@code null} from being added to the set. 6657dd252788645e940eada959bdde927426e2531c9Paul Duffin * 6667dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p><b>Warning:</b> This method assumes that for any instance {@code k} of 6677dd252788645e940eada959bdde927426e2531c9Paul Duffin * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also 6687dd252788645e940eada959bdde927426e2531c9Paul Duffin * of type {@code K}. Using a key type for which this may not hold, such as 6697dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code ArrayList}, may risk a {@code ClassCastException} when calling 6707dd252788645e940eada959bdde927426e2531c9Paul Duffin * methods on the resulting map view. 6717dd252788645e940eada959bdde927426e2531c9Paul Duffin * 6727dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 14.0 6737dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 6747dd252788645e940eada959bdde927426e2531c9Paul Duffin @Beta 6750888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> Map<K, V> asMap( 6760888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<K> set, Function<? super K, V> function) { 6777dd252788645e940eada959bdde927426e2531c9Paul Duffin if (set instanceof SortedSet) { 6787dd252788645e940eada959bdde927426e2531c9Paul Duffin return asMap((SortedSet<K>) set, function); 6797dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 6807dd252788645e940eada959bdde927426e2531c9Paul Duffin return new AsMapView<K, V>(set, function); 6817dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6827dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6837dd252788645e940eada959bdde927426e2531c9Paul Duffin 6847dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 6857dd252788645e940eada959bdde927426e2531c9Paul Duffin * Returns a view of the sorted set as a map, mapping keys from the set 6867dd252788645e940eada959bdde927426e2531c9Paul Duffin * according to the specified function. 6877dd252788645e940eada959bdde927426e2531c9Paul Duffin * 6887dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Specifically, for each {@code k} in the backing set, the returned map 6897dd252788645e940eada959bdde927426e2531c9Paul Duffin * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code 6907dd252788645e940eada959bdde927426e2531c9Paul Duffin * keySet}, {@code values}, and {@code entrySet} views of the returned map 6917dd252788645e940eada959bdde927426e2531c9Paul Duffin * iterate in the same order as the backing set. 6927dd252788645e940eada959bdde927426e2531c9Paul Duffin * 6937dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Modifications to the backing set are read through to the returned map. 6947dd252788645e940eada959bdde927426e2531c9Paul Duffin * The returned map supports removal operations if the backing set does. 6957dd252788645e940eada959bdde927426e2531c9Paul Duffin * Removal operations write through to the backing set. The returned map does 6967dd252788645e940eada959bdde927426e2531c9Paul Duffin * not support put operations. 6977dd252788645e940eada959bdde927426e2531c9Paul Duffin * 6983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> If the function rejects {@code null}, caution is 6997dd252788645e940eada959bdde927426e2531c9Paul Duffin * required to make sure the set does not contain {@code null}, because the 7007dd252788645e940eada959bdde927426e2531c9Paul Duffin * view cannot stop {@code null} from being added to the set. 7017dd252788645e940eada959bdde927426e2531c9Paul Duffin * 7027dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p><b>Warning:</b> This method assumes that for any instance {@code k} of 7037dd252788645e940eada959bdde927426e2531c9Paul Duffin * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also of 7047dd252788645e940eada959bdde927426e2531c9Paul Duffin * type {@code K}. Using a key type for which this may not hold, such as 7057dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code ArrayList}, may risk a {@code ClassCastException} when calling 7067dd252788645e940eada959bdde927426e2531c9Paul Duffin * methods on the resulting map view. 7077dd252788645e940eada959bdde927426e2531c9Paul Duffin * 7087dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 14.0 7097dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 7107dd252788645e940eada959bdde927426e2531c9Paul Duffin @Beta 7110888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> SortedMap<K, V> asMap( 7120888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedSet<K> set, Function<? super K, V> function) { 7130888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Platform.mapsAsMapSortedSet(set, function); 7140888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 7150888a09821a98ac0680fad765217302858e70fa4Paul Duffin 7160888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> SortedMap<K, V> asMapSortedIgnoreNavigable(SortedSet<K> set, 7170888a09821a98ac0680fad765217302858e70fa4Paul Duffin Function<? super K, V> function) { 7187dd252788645e940eada959bdde927426e2531c9Paul Duffin return new SortedAsMapView<K, V>(set, function); 7197dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7207dd252788645e940eada959bdde927426e2531c9Paul Duffin 7213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 7223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns a view of the navigable set as a map, mapping keys from the set 7233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * according to the specified function. 7243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 7253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>Specifically, for each {@code k} in the backing set, the returned map 7263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * has an entry mapping {@code k} to {@code function.apply(k)}. The {@code 7273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * keySet}, {@code values}, and {@code entrySet} views of the returned map 7283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * iterate in the same order as the backing set. 7293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 7303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>Modifications to the backing set are read through to the returned map. 7313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * The returned map supports removal operations if the backing set does. 7323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Removal operations write through to the backing set. The returned map 7333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * does not support put operations. 7343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 7353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> If the function rejects {@code null}, caution is 7363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * required to make sure the set does not contain {@code null}, because the 7373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * view cannot stop {@code null} from being added to the set. 7383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 7393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> This method assumes that for any instance {@code k} of 7403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * key type {@code K}, {@code k.equals(k2)} implies that {@code k2} is also 7413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * of type {@code K}. Using a key type for which this may not hold, such as 7423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * {@code ArrayList}, may risk a {@code ClassCastException} when calling 7433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * methods on the resulting map view. 7443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 7453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 14.0 7463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 7473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Beta 7483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 7493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public static <K, V> NavigableMap<K, V> asMap( 7503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableSet<K> set, Function<? super K, V> function) { 7513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new NavigableAsMapView<K, V>(set, function); 7523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 7533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 7547dd252788645e940eada959bdde927426e2531c9Paul Duffin private static class AsMapView<K, V> extends ImprovedAbstractMap<K, V> { 7557dd252788645e940eada959bdde927426e2531c9Paul Duffin 7567dd252788645e940eada959bdde927426e2531c9Paul Duffin private final Set<K> set; 7577dd252788645e940eada959bdde927426e2531c9Paul Duffin final Function<? super K, V> function; 7587dd252788645e940eada959bdde927426e2531c9Paul Duffin 7597dd252788645e940eada959bdde927426e2531c9Paul Duffin Set<K> backingSet() { 7607dd252788645e940eada959bdde927426e2531c9Paul Duffin return set; 7617dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7627dd252788645e940eada959bdde927426e2531c9Paul Duffin 7637dd252788645e940eada959bdde927426e2531c9Paul Duffin AsMapView(Set<K> set, Function<? super K, V> function) { 7647dd252788645e940eada959bdde927426e2531c9Paul Duffin this.set = checkNotNull(set); 7657dd252788645e940eada959bdde927426e2531c9Paul Duffin this.function = checkNotNull(function); 7667dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7677dd252788645e940eada959bdde927426e2531c9Paul Duffin 7687dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 7690888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Set<K> createKeySet() { 7707dd252788645e940eada959bdde927426e2531c9Paul Duffin return removeOnlySet(backingSet()); 7717dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7727dd252788645e940eada959bdde927426e2531c9Paul Duffin 7737dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 7740888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<V> createValues() { 7757dd252788645e940eada959bdde927426e2531c9Paul Duffin return Collections2.transform(set, function); 7767dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7777dd252788645e940eada959bdde927426e2531c9Paul Duffin 7787dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 7797dd252788645e940eada959bdde927426e2531c9Paul Duffin public int size() { 7807dd252788645e940eada959bdde927426e2531c9Paul Duffin return backingSet().size(); 7817dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7827dd252788645e940eada959bdde927426e2531c9Paul Duffin 7837dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 7847dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean containsKey(@Nullable Object key) { 7857dd252788645e940eada959bdde927426e2531c9Paul Duffin return backingSet().contains(key); 7867dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7877dd252788645e940eada959bdde927426e2531c9Paul Duffin 7887dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 7897dd252788645e940eada959bdde927426e2531c9Paul Duffin public V get(@Nullable Object key) { 7900888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (Collections2.safeContains(backingSet(), key)) { 7910888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it 7927dd252788645e940eada959bdde927426e2531c9Paul Duffin K k = (K) key; 7937dd252788645e940eada959bdde927426e2531c9Paul Duffin return function.apply(k); 7947dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 7957dd252788645e940eada959bdde927426e2531c9Paul Duffin return null; 7967dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7977dd252788645e940eada959bdde927426e2531c9Paul Duffin } 7987dd252788645e940eada959bdde927426e2531c9Paul Duffin 7997dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 8007dd252788645e940eada959bdde927426e2531c9Paul Duffin public V remove(@Nullable Object key) { 8017dd252788645e940eada959bdde927426e2531c9Paul Duffin if (backingSet().remove(key)) { 8020888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it 8037dd252788645e940eada959bdde927426e2531c9Paul Duffin K k = (K) key; 8047dd252788645e940eada959bdde927426e2531c9Paul Duffin return function.apply(k); 8057dd252788645e940eada959bdde927426e2531c9Paul Duffin } else { 8067dd252788645e940eada959bdde927426e2531c9Paul Duffin return null; 8077dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8087dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8097dd252788645e940eada959bdde927426e2531c9Paul Duffin 8107dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 8117dd252788645e940eada959bdde927426e2531c9Paul Duffin public void clear() { 8127dd252788645e940eada959bdde927426e2531c9Paul Duffin backingSet().clear(); 8137dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8147dd252788645e940eada959bdde927426e2531c9Paul Duffin 8157dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 8167dd252788645e940eada959bdde927426e2531c9Paul Duffin protected Set<Entry<K, V>> createEntrySet() { 8177dd252788645e940eada959bdde927426e2531c9Paul Duffin return new EntrySet<K, V>() { 8187dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 8197dd252788645e940eada959bdde927426e2531c9Paul Duffin Map<K, V> map() { 8207dd252788645e940eada959bdde927426e2531c9Paul Duffin return AsMapView.this; 8217dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8227dd252788645e940eada959bdde927426e2531c9Paul Duffin 8237dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 8247dd252788645e940eada959bdde927426e2531c9Paul Duffin public Iterator<Entry<K, V>> iterator() { 8250888a09821a98ac0680fad765217302858e70fa4Paul Duffin return asMapEntryIterator(backingSet(), function); 8267dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8277dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 8287dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8297dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8307dd252788645e940eada959bdde927426e2531c9Paul Duffin 8310888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> Iterator<Entry<K, V>> asMapEntryIterator( 8327dd252788645e940eada959bdde927426e2531c9Paul Duffin Set<K> set, final Function<? super K, V> function) { 8337dd252788645e940eada959bdde927426e2531c9Paul Duffin return new TransformedIterator<K, Entry<K,V>>(set.iterator()) { 8347dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 8350888a09821a98ac0680fad765217302858e70fa4Paul Duffin Entry<K, V> transform(final K key) { 8360888a09821a98ac0680fad765217302858e70fa4Paul Duffin return immutableEntry(key, function.apply(key)); 8377dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8387dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 8397dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8407dd252788645e940eada959bdde927426e2531c9Paul Duffin 8410888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static class SortedAsMapView<K, V> extends AsMapView<K, V> 8420888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements SortedMap<K, V> { 8437dd252788645e940eada959bdde927426e2531c9Paul Duffin 8447dd252788645e940eada959bdde927426e2531c9Paul Duffin SortedAsMapView(SortedSet<K> set, Function<? super K, V> function) { 8457dd252788645e940eada959bdde927426e2531c9Paul Duffin super(set, function); 8467dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8477dd252788645e940eada959bdde927426e2531c9Paul Duffin 8487dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 8497dd252788645e940eada959bdde927426e2531c9Paul Duffin SortedSet<K> backingSet() { 8507dd252788645e940eada959bdde927426e2531c9Paul Duffin return (SortedSet<K>) super.backingSet(); 8517dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8527dd252788645e940eada959bdde927426e2531c9Paul Duffin 8530888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 8547dd252788645e940eada959bdde927426e2531c9Paul Duffin public Comparator<? super K> comparator() { 8557dd252788645e940eada959bdde927426e2531c9Paul Duffin return backingSet().comparator(); 8567dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8577dd252788645e940eada959bdde927426e2531c9Paul Duffin 8587dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 8597dd252788645e940eada959bdde927426e2531c9Paul Duffin public Set<K> keySet() { 8607dd252788645e940eada959bdde927426e2531c9Paul Duffin return removeOnlySortedSet(backingSet()); 8617dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8627dd252788645e940eada959bdde927426e2531c9Paul Duffin 8630888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 8647dd252788645e940eada959bdde927426e2531c9Paul Duffin public SortedMap<K, V> subMap(K fromKey, K toKey) { 8657dd252788645e940eada959bdde927426e2531c9Paul Duffin return asMap(backingSet().subSet(fromKey, toKey), function); 8667dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8677dd252788645e940eada959bdde927426e2531c9Paul Duffin 8680888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 8697dd252788645e940eada959bdde927426e2531c9Paul Duffin public SortedMap<K, V> headMap(K toKey) { 8707dd252788645e940eada959bdde927426e2531c9Paul Duffin return asMap(backingSet().headSet(toKey), function); 8717dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8727dd252788645e940eada959bdde927426e2531c9Paul Duffin 8730888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 8747dd252788645e940eada959bdde927426e2531c9Paul Duffin public SortedMap<K, V> tailMap(K fromKey) { 8757dd252788645e940eada959bdde927426e2531c9Paul Duffin return asMap(backingSet().tailSet(fromKey), function); 8767dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8777dd252788645e940eada959bdde927426e2531c9Paul Duffin 8780888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 8797dd252788645e940eada959bdde927426e2531c9Paul Duffin public K firstKey() { 8807dd252788645e940eada959bdde927426e2531c9Paul Duffin return backingSet().first(); 8817dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8827dd252788645e940eada959bdde927426e2531c9Paul Duffin 8830888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 8847dd252788645e940eada959bdde927426e2531c9Paul Duffin public K lastKey() { 8857dd252788645e940eada959bdde927426e2531c9Paul Duffin return backingSet().last(); 8867dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8877dd252788645e940eada959bdde927426e2531c9Paul Duffin } 8887dd252788645e940eada959bdde927426e2531c9Paul Duffin 8893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 8903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private static final class NavigableAsMapView<K, V> 8913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin extends AbstractNavigableMap<K, V> { 8923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /* 8933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Using AbstractNavigableMap is simpler than extending SortedAsMapView and rewriting all the 8943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableMap methods. 8953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 8963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 8973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private final NavigableSet<K> set; 8983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private final Function<? super K, V> function; 8993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableAsMapView(NavigableSet<K> ks, Function<? super K, V> vFunction) { 9013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin this.set = checkNotNull(ks); 9023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin this.function = checkNotNull(vFunction); 9033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> subMap( 9073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { 9083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return asMap(set.subSet(fromKey, fromInclusive, toKey, toInclusive), function); 9093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> headMap(K toKey, boolean inclusive) { 9133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return asMap(set.headSet(toKey, inclusive), function); 9143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) { 9183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return asMap(set.tailSet(fromKey, inclusive), function); 9193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Comparator<? super K> comparator() { 9233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return set.comparator(); 9243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Nullable 9283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public V get(@Nullable Object key) { 9293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin if (Collections2.safeContains(set, key)) { 9303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it 9313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin K k = (K) key; 9323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return function.apply(k); 9333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } else { 9343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return null; 9353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public void clear() { 9403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin set.clear(); 9413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Iterator<Entry<K, V>> entryIterator() { 9453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return asMapEntryIterator(set, function); 9463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Iterator<Entry<K, V>> descendingEntryIterator() { 9503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return descendingMap().entrySet().iterator(); 9513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> navigableKeySet() { 9553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return removeOnlyNavigableSet(set); 9563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public int size() { 9603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return set.size(); 9613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 9643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> descendingMap() { 9653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return asMap(set.descendingSet(), function); 9663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 9683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 9697dd252788645e940eada959bdde927426e2531c9Paul Duffin private static <E> Set<E> removeOnlySet(final Set<E> set) { 9707dd252788645e940eada959bdde927426e2531c9Paul Duffin return new ForwardingSet<E>() { 9717dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 9727dd252788645e940eada959bdde927426e2531c9Paul Duffin protected Set<E> delegate() { 9737dd252788645e940eada959bdde927426e2531c9Paul Duffin return set; 9747dd252788645e940eada959bdde927426e2531c9Paul Duffin } 9757dd252788645e940eada959bdde927426e2531c9Paul Duffin 9767dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 9777dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean add(E element) { 9787dd252788645e940eada959bdde927426e2531c9Paul Duffin throw new UnsupportedOperationException(); 9797dd252788645e940eada959bdde927426e2531c9Paul Duffin } 9807dd252788645e940eada959bdde927426e2531c9Paul Duffin 9817dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 9827dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean addAll(Collection<? extends E> es) { 9837dd252788645e940eada959bdde927426e2531c9Paul Duffin throw new UnsupportedOperationException(); 9847dd252788645e940eada959bdde927426e2531c9Paul Duffin } 9857dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 9867dd252788645e940eada959bdde927426e2531c9Paul Duffin } 9877dd252788645e940eada959bdde927426e2531c9Paul Duffin 9887dd252788645e940eada959bdde927426e2531c9Paul Duffin private static <E> SortedSet<E> removeOnlySortedSet(final SortedSet<E> set) { 9897dd252788645e940eada959bdde927426e2531c9Paul Duffin return new ForwardingSortedSet<E>() { 9907dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 9917dd252788645e940eada959bdde927426e2531c9Paul Duffin protected SortedSet<E> delegate() { 9927dd252788645e940eada959bdde927426e2531c9Paul Duffin return set; 9937dd252788645e940eada959bdde927426e2531c9Paul Duffin } 9947dd252788645e940eada959bdde927426e2531c9Paul Duffin 9957dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 9967dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean add(E element) { 9977dd252788645e940eada959bdde927426e2531c9Paul Duffin throw new UnsupportedOperationException(); 9987dd252788645e940eada959bdde927426e2531c9Paul Duffin } 9997dd252788645e940eada959bdde927426e2531c9Paul Duffin 10007dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 10017dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean addAll(Collection<? extends E> es) { 10027dd252788645e940eada959bdde927426e2531c9Paul Duffin throw new UnsupportedOperationException(); 10037dd252788645e940eada959bdde927426e2531c9Paul Duffin } 10047dd252788645e940eada959bdde927426e2531c9Paul Duffin 10057dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 10067dd252788645e940eada959bdde927426e2531c9Paul Duffin public SortedSet<E> headSet(E toElement) { 10077dd252788645e940eada959bdde927426e2531c9Paul Duffin return removeOnlySortedSet(super.headSet(toElement)); 10087dd252788645e940eada959bdde927426e2531c9Paul Duffin } 10097dd252788645e940eada959bdde927426e2531c9Paul Duffin 10107dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 10117dd252788645e940eada959bdde927426e2531c9Paul Duffin public SortedSet<E> subSet(E fromElement, E toElement) { 10127dd252788645e940eada959bdde927426e2531c9Paul Duffin return removeOnlySortedSet(super.subSet(fromElement, toElement)); 10137dd252788645e940eada959bdde927426e2531c9Paul Duffin } 10147dd252788645e940eada959bdde927426e2531c9Paul Duffin 10157dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 10167dd252788645e940eada959bdde927426e2531c9Paul Duffin public SortedSet<E> tailSet(E fromElement) { 10177dd252788645e940eada959bdde927426e2531c9Paul Duffin return removeOnlySortedSet(super.tailSet(fromElement)); 10187dd252788645e940eada959bdde927426e2531c9Paul Duffin } 10197dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 10203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableSet") 10233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private static <E> NavigableSet<E> removeOnlyNavigableSet(final NavigableSet<E> set) { 10243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new ForwardingNavigableSet<E>() { 10253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin protected NavigableSet<E> delegate() { 10273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return set; 10283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public boolean add(E element) { 10323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin throw new UnsupportedOperationException(); 10333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public boolean addAll(Collection<? extends E> es) { 10373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin throw new UnsupportedOperationException(); 10383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedSet<E> headSet(E toElement) { 10423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return removeOnlySortedSet(super.headSet(toElement)); 10433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedSet<E> subSet(E fromElement, E toElement) { 10473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return removeOnlySortedSet( 10483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin super.subSet(fromElement, toElement)); 10493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedSet<E> tailSet(E fromElement) { 10533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return removeOnlySortedSet(super.tailSet(fromElement)); 10543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<E> headSet(E toElement, boolean inclusive) { 10583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return removeOnlyNavigableSet(super.headSet(toElement, inclusive)); 10593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<E> tailSet(E fromElement, boolean inclusive) { 10633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return removeOnlyNavigableSet(super.tailSet(fromElement, inclusive)); 10643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, 10683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin E toElement, boolean toInclusive) { 10693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return removeOnlyNavigableSet(super.subSet( 10703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin fromElement, fromInclusive, toElement, toInclusive)); 10713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 10733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 10743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<E> descendingSet() { 10753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return removeOnlyNavigableSet(super.descendingSet()); 10763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin }; 10783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 10797dd252788645e940eada959bdde927426e2531c9Paul Duffin 10807dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 10810888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns an immutable map whose keys are the distinct elements of {@code 10820888a09821a98ac0680fad765217302858e70fa4Paul Duffin * keys} and whose value for each key was computed by {@code valueFunction}. 10830888a09821a98ac0680fad765217302858e70fa4Paul Duffin * The map's iteration order is the order of the first appearance of each key 10840888a09821a98ac0680fad765217302858e70fa4Paul Duffin * in {@code keys}. 10850888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 10860888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p>If {@code keys} is a {@link Set}, a live view can be obtained instead of 10870888a09821a98ac0680fad765217302858e70fa4Paul Duffin * a copy using {@link Maps#asMap(Set, Function)}. 10887dd252788645e940eada959bdde927426e2531c9Paul Duffin * 10897dd252788645e940eada959bdde927426e2531c9Paul Duffin * @throws NullPointerException if any element of {@code keys} is 10907dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code null}, or if {@code valueFunction} produces {@code null} 10917dd252788645e940eada959bdde927426e2531c9Paul Duffin * for any key 10927dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 14.0 10937dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 10947dd252788645e940eada959bdde927426e2531c9Paul Duffin @Beta 10957dd252788645e940eada959bdde927426e2531c9Paul Duffin public static <K, V> ImmutableMap<K, V> toMap(Iterable<K> keys, 10967dd252788645e940eada959bdde927426e2531c9Paul Duffin Function<? super K, V> valueFunction) { 10977dd252788645e940eada959bdde927426e2531c9Paul Duffin return toMap(keys.iterator(), valueFunction); 10987dd252788645e940eada959bdde927426e2531c9Paul Duffin } 10997dd252788645e940eada959bdde927426e2531c9Paul Duffin 11007dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 11010888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns an immutable map whose keys are the distinct elements of {@code 11020888a09821a98ac0680fad765217302858e70fa4Paul Duffin * keys} and whose value for each key was computed by {@code valueFunction}. 11030888a09821a98ac0680fad765217302858e70fa4Paul Duffin * The map's iteration order is the order of the first appearance of each key 11040888a09821a98ac0680fad765217302858e70fa4Paul Duffin * in {@code keys}. 11057dd252788645e940eada959bdde927426e2531c9Paul Duffin * 11067dd252788645e940eada959bdde927426e2531c9Paul Duffin * @throws NullPointerException if any element of {@code keys} is 11077dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code null}, or if {@code valueFunction} produces {@code null} 11087dd252788645e940eada959bdde927426e2531c9Paul Duffin * for any key 11097dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 14.0 11107dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 11117dd252788645e940eada959bdde927426e2531c9Paul Duffin @Beta 11127dd252788645e940eada959bdde927426e2531c9Paul Duffin public static <K, V> ImmutableMap<K, V> toMap(Iterator<K> keys, 11137dd252788645e940eada959bdde927426e2531c9Paul Duffin Function<? super K, V> valueFunction) { 11147dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(valueFunction); 11157dd252788645e940eada959bdde927426e2531c9Paul Duffin // Using LHM instead of a builder so as not to fail on duplicate keys 11167dd252788645e940eada959bdde927426e2531c9Paul Duffin Map<K, V> builder = newLinkedHashMap(); 11177dd252788645e940eada959bdde927426e2531c9Paul Duffin while (keys.hasNext()) { 11187dd252788645e940eada959bdde927426e2531c9Paul Duffin K key = keys.next(); 11197dd252788645e940eada959bdde927426e2531c9Paul Duffin builder.put(key, valueFunction.apply(key)); 11207dd252788645e940eada959bdde927426e2531c9Paul Duffin } 11217dd252788645e940eada959bdde927426e2531c9Paul Duffin return ImmutableMap.copyOf(builder); 11227dd252788645e940eada959bdde927426e2531c9Paul Duffin } 11237dd252788645e940eada959bdde927426e2531c9Paul Duffin 11241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1125dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Returns an immutable map for which the {@link Map#values} are the given 1126dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * elements in the given order, and each key is the product of invoking a 1127dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * supplied function on its corresponding value. 11283c77433663281544363151bf284b0240dfd22a42Paul Duffin * 1129dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param values the values to use when constructing the {@code Map} 1130dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param keyFunction the function used to produce the key for each value 1131dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @return a map mapping the result of evaluating the function {@code 1132dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * keyFunction} on each value in the input collection to that value 1133dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @throws IllegalArgumentException if {@code keyFunction} produces the same 1134dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * key for more than one value in the input collection 1135dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @throws NullPointerException if any elements of {@code values} is null, or 1136dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * if {@code keyFunction} produces {@code null} for any value 11371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 11380888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> ImmutableMap<K, V> uniqueIndex( 11390888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterable<V> values, Function<? super V, K> keyFunction) { 1140dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return uniqueIndex(values.iterator(), keyFunction); 11411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 11431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1144dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Returns an immutable map for which the {@link Map#values} are the given 1145dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * elements in the given order, and each key is the product of invoking a 1146dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * supplied function on its corresponding value. 11473c77433663281544363151bf284b0240dfd22a42Paul Duffin * 1148dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param values the values to use when constructing the {@code Map} 1149dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param keyFunction the function used to produce the key for each value 1150dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @return a map mapping the result of evaluating the function {@code 1151dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * keyFunction} on each value in the input collection to that value 1152dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @throws IllegalArgumentException if {@code keyFunction} produces the same 1153dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * key for more than one value in the input collection 1154dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @throws NullPointerException if any elements of {@code values} is null, or 1155dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * if {@code keyFunction} produces {@code null} for any value 1156dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @since 10.0 11571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 11580888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> ImmutableMap<K, V> uniqueIndex( 11590888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterator<V> values, Function<? super V, K> keyFunction) { 1160dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin checkNotNull(keyFunction); 1161dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin ImmutableMap.Builder<K, V> builder = ImmutableMap.builder(); 1162dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin while (values.hasNext()) { 1163dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin V value = values.next(); 1164dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin builder.put(keyFunction.apply(value), value); 11653c77433663281544363151bf284b0240dfd22a42Paul Duffin } 1166dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return builder.build(); 1167dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin } 11681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1169dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin /** 1170dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Creates an {@code ImmutableMap<String, String>} from a {@code Properties} 1171dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * instance. Properties normally derive from {@code Map<Object, Object>}, but 1172dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * they typically contain strings, which is awkward. This method lets you get 1173dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * a plain-old-{@code Map} out of a {@code Properties}. 1174dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * 1175dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param properties a {@code Properties} object to be converted 1176dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @return an immutable map containing all the entries in {@code properties} 1177dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @throws ClassCastException if any key in {@code Properties} is not a {@code 1178dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * String} 1179dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @throws NullPointerException if any key or value in {@code Properties} is 1180dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * null 1181dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin */ 1182dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin @GwtIncompatible("java.util.Properties") 11830888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static ImmutableMap<String, String> fromProperties( 11840888a09821a98ac0680fad765217302858e70fa4Paul Duffin Properties properties) { 1185dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); 11861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1187dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin for (Enumeration<?> e = properties.propertyNames(); e.hasMoreElements();) { 1188dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin String key = (String) e.nextElement(); 1189dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin builder.put(key, properties.getProperty(key)); 11901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1192dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return builder.build(); 1193dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin } 11941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1195dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin /** 1196dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Returns an immutable map entry with the specified key and value. The {@link 1197dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Entry#setValue} operation throws an {@link UnsupportedOperationException}. 1198dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * 1199dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * <p>The returned entry is serializable. 1200dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * 1201dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param key the key to be associated with the returned entry 1202dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param value the value to be associated with the returned entry 1203dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin */ 1204dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin @GwtCompatible(serializable = true) 12050888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> Entry<K, V> immutableEntry( 12060888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Nullable K key, @Nullable V value) { 1207dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return new ImmutableEntry<K, V>(key, value); 1208dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin } 12093c77433663281544363151bf284b0240dfd22a42Paul Duffin 1210dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin /** 1211dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Returns an unmodifiable view of the specified set of entries. The {@link 1212dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Entry#setValue} operation throws an {@link UnsupportedOperationException}, 1213dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * as do any operations that would modify the returned set. 1214dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * 1215dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param entrySet the entries for which to return an unmodifiable view 1216dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @return an unmodifiable view of the entries 1217dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin */ 12180888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> Set<Entry<K, V>> unmodifiableEntrySet( 12190888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<Entry<K, V>> entrySet) { 12200888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new UnmodifiableEntrySet<K, V>( 12210888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collections.unmodifiableSet(entrySet)); 1222dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin } 12233c77433663281544363151bf284b0240dfd22a42Paul Duffin 1224dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin /** 1225dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Returns an unmodifiable view of the specified map entry. The {@link 1226dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Entry#setValue} operation throws an {@link UnsupportedOperationException}. 1227dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * This also has the side-effect of redefining {@code equals} to comply with 1228dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * the Entry contract, to avoid a possible nefarious implementation of equals. 1229dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * 1230dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @param entry the entry for which to return an unmodifiable view 1231dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @return an unmodifiable view of the entry 1232dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin */ 12330888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> Entry<K, V> unmodifiableEntry(final Entry<? extends K, ? extends V> entry) { 1234dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin checkNotNull(entry); 1235dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return new AbstractMapEntry<K, V>() { 12360888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public K getKey() { 1237dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return entry.getKey(); 12383c77433663281544363151bf284b0240dfd22a42Paul Duffin } 12393c77433663281544363151bf284b0240dfd22a42Paul Duffin 12400888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public V getValue() { 1241dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return entry.getValue(); 12423c77433663281544363151bf284b0240dfd22a42Paul Duffin } 1243dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin }; 1244dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin } 1245dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin 1246dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin /** @see Multimaps#unmodifiableEntries */ 12470888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class UnmodifiableEntries<K, V> 12480888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends ForwardingCollection<Entry<K, V>> { 1249dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin private final Collection<Entry<K, V>> entries; 1250dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin 1251dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin UnmodifiableEntries(Collection<Entry<K, V>> entries) { 1252dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin this.entries = entries; 12533c77433663281544363151bf284b0240dfd22a42Paul Duffin } 12543c77433663281544363151bf284b0240dfd22a42Paul Duffin 12550888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected Collection<Entry<K, V>> delegate() { 1256dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return entries; 12573c77433663281544363151bf284b0240dfd22a42Paul Duffin } 12583c77433663281544363151bf284b0240dfd22a42Paul Duffin 12590888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Iterator<Entry<K, V>> iterator() { 1260dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin final Iterator<Entry<K, V>> delegate = super.iterator(); 12610888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new UnmodifiableIterator<Entry<K, V>>() { 12627dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 12630888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean hasNext() { 12640888a09821a98ac0680fad765217302858e70fa4Paul Duffin return delegate.hasNext(); 12651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Entry<K, V> next() { 12680888a09821a98ac0680fad765217302858e70fa4Paul Duffin return unmodifiableEntry(delegate.next()); 12691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 12711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1273dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin // See java.util.Collections.UnmodifiableEntrySet for details on attacks. 12741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12750888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Object[] toArray() { 12760888a09821a98ac0680fad765217302858e70fa4Paul Duffin return standardToArray(); 12771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12790888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public <T> T[] toArray(T[] array) { 12800888a09821a98ac0680fad765217302858e70fa4Paul Duffin return standardToArray(array); 12811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12820888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 12831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12840888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** @see Maps#unmodifiableEntrySet(Set) */ 12850888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class UnmodifiableEntrySet<K, V> 12860888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends UnmodifiableEntries<K, V> implements Set<Entry<K, V>> { 12870888a09821a98ac0680fad765217302858e70fa4Paul Duffin UnmodifiableEntrySet(Set<Entry<K, V>> entries) { 12880888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(entries); 12891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12910888a09821a98ac0680fad765217302858e70fa4Paul Duffin // See java.util.Collections.UnmodifiableEntrySet for details on attacks. 12920888a09821a98ac0680fad765217302858e70fa4Paul Duffin 12930888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean equals(@Nullable Object object) { 12940888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Sets.equalsImpl(this, object); 12951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12970888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int hashCode() { 12980888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Sets.hashCodeImpl(this); 12991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13000888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 13011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13020888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 13030888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns a {@link Converter} that converts values using {@link BiMap#get bimap.get()}, 13040888a09821a98ac0680fad765217302858e70fa4Paul Duffin * and whose inverse view converts values using 13050888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link BiMap#inverse bimap.inverse()}{@code .get()}. 13060888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 13070888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p>To use a plain {@link Map} as a {@link Function}, see 13080888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link com.google.common.base.Functions#forMap(Map)} or 13090888a09821a98ac0680fad765217302858e70fa4Paul Duffin * {@link com.google.common.base.Functions#forMap(Map, Object)}. 13100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 13110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @since 16.0 13120888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 13130888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Beta 13140888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <A, B> Converter<A, B> asConverter(final BiMap<A, B> bimap) { 13150888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new BiMapConverter<A, B>(bimap); 13160888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 13170888a09821a98ac0680fad765217302858e70fa4Paul Duffin 13180888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static final class BiMapConverter<A, B> extends Converter<A, B> implements Serializable { 13190888a09821a98ac0680fad765217302858e70fa4Paul Duffin private final BiMap<A, B> bimap; 13200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 13210888a09821a98ac0680fad765217302858e70fa4Paul Duffin BiMapConverter(BiMap<A, B> bimap) { 13220888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.bimap = checkNotNull(bimap); 13231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13257dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 13260888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected B doForward(A a) { 13270888a09821a98ac0680fad765217302858e70fa4Paul Duffin return convert(bimap, a); 13283c77433663281544363151bf284b0240dfd22a42Paul Duffin } 13293c77433663281544363151bf284b0240dfd22a42Paul Duffin 13307dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 13310888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected A doBackward(B b) { 13320888a09821a98ac0680fad765217302858e70fa4Paul Duffin return convert(bimap.inverse(), b); 13331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13350888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <X, Y> Y convert(BiMap<X, Y> bimap, X input) { 13360888a09821a98ac0680fad765217302858e70fa4Paul Duffin Y output = bimap.get(input); 13370888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkArgument(output != null, "No non-null mapping present for input: %s", input); 13380888a09821a98ac0680fad765217302858e70fa4Paul Duffin return output; 13391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13417dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 13427dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean equals(@Nullable Object object) { 13430888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (object instanceof BiMapConverter) { 13440888a09821a98ac0680fad765217302858e70fa4Paul Duffin BiMapConverter<?, ?> that = (BiMapConverter<?, ?>) object; 13450888a09821a98ac0680fad765217302858e70fa4Paul Duffin return this.bimap.equals(that.bimap); 13460888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 13470888a09821a98ac0680fad765217302858e70fa4Paul Duffin return false; 13481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13507dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 13517dd252788645e940eada959bdde927426e2531c9Paul Duffin public int hashCode() { 13520888a09821a98ac0680fad765217302858e70fa4Paul Duffin return bimap.hashCode(); 13531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13540888a09821a98ac0680fad765217302858e70fa4Paul Duffin 13550888a09821a98ac0680fad765217302858e70fa4Paul Duffin // There's really no good way to implement toString() without printing the entire BiMap, right? 13560888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 13570888a09821a98ac0680fad765217302858e70fa4Paul Duffin public String toString() { 13580888a09821a98ac0680fad765217302858e70fa4Paul Duffin return "Maps.asConverter(" + bimap + ")"; 13590888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 13600888a09821a98ac0680fad765217302858e70fa4Paul Duffin 13610888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static final long serialVersionUID = 0L; 13621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 13657dd252788645e940eada959bdde927426e2531c9Paul Duffin * Returns a synchronized (thread-safe) bimap backed by the specified bimap. 13667dd252788645e940eada959bdde927426e2531c9Paul Duffin * In order to guarantee serial access, it is critical that <b>all</b> access 13677dd252788645e940eada959bdde927426e2531c9Paul Duffin * to the backing bimap is accomplished through the returned bimap. 13687dd252788645e940eada959bdde927426e2531c9Paul Duffin * 13697dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>It is imperative that the user manually synchronize on the returned map 13707dd252788645e940eada959bdde927426e2531c9Paul Duffin * when accessing any of its collection views: <pre> {@code 13717dd252788645e940eada959bdde927426e2531c9Paul Duffin * 13727dd252788645e940eada959bdde927426e2531c9Paul Duffin * BiMap<Long, String> map = Maps.synchronizedBiMap( 13737dd252788645e940eada959bdde927426e2531c9Paul Duffin * HashBiMap.<Long, String>create()); 13747dd252788645e940eada959bdde927426e2531c9Paul Duffin * ... 13757dd252788645e940eada959bdde927426e2531c9Paul Duffin * Set<Long> set = map.keySet(); // Needn't be in synchronized block 13767dd252788645e940eada959bdde927426e2531c9Paul Duffin * ... 13777dd252788645e940eada959bdde927426e2531c9Paul Duffin * synchronized (map) { // Synchronizing on map, not set! 13787dd252788645e940eada959bdde927426e2531c9Paul Duffin * Iterator<Long> it = set.iterator(); // Must be in synchronized block 13797dd252788645e940eada959bdde927426e2531c9Paul Duffin * while (it.hasNext()) { 13807dd252788645e940eada959bdde927426e2531c9Paul Duffin * foo(it.next()); 13817dd252788645e940eada959bdde927426e2531c9Paul Duffin * } 13827dd252788645e940eada959bdde927426e2531c9Paul Duffin * }}</pre> 13837dd252788645e940eada959bdde927426e2531c9Paul Duffin * 13840888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p>Failure to follow this advice may result in non-deterministic behavior. 13857dd252788645e940eada959bdde927426e2531c9Paul Duffin * 13867dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The returned bimap will be serializable if the specified bimap is 13877dd252788645e940eada959bdde927426e2531c9Paul Duffin * serializable. 13887dd252788645e940eada959bdde927426e2531c9Paul Duffin * 13897dd252788645e940eada959bdde927426e2531c9Paul Duffin * @param bimap the bimap to be wrapped in a synchronized view 13907dd252788645e940eada959bdde927426e2531c9Paul Duffin * @return a sychronized view of the specified bimap 13917dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 13927dd252788645e940eada959bdde927426e2531c9Paul Duffin public static <K, V> BiMap<K, V> synchronizedBiMap(BiMap<K, V> bimap) { 13937dd252788645e940eada959bdde927426e2531c9Paul Duffin return Synchronized.biMap(bimap, null); 13947dd252788645e940eada959bdde927426e2531c9Paul Duffin } 13957dd252788645e940eada959bdde927426e2531c9Paul Duffin 13967dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 13971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns an unmodifiable view of the specified bimap. This method allows 13981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * modules to provide users with "read-only" access to internal bimaps. Query 13991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * operations on the returned bimap "read through" to the specified bimap, and 14001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * attempts to modify the returned map, whether direct or via its collection 14011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * views, result in an {@code UnsupportedOperationException}. 14021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 14031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned bimap will be serializable if the specified bimap is 14041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * serializable. 14051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 14061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param bimap the bimap for which an unmodifiable view is to be returned 14071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return an unmodifiable view of the specified bimap 14081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 14090888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> BiMap<K, V> unmodifiableBiMap( 14100888a09821a98ac0680fad765217302858e70fa4Paul Duffin BiMap<? extends K, ? extends V> bimap) { 14111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new UnmodifiableBiMap<K, V>(bimap, null); 14121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** @see Maps#unmodifiableBiMap(BiMap) */ 14150888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static class UnmodifiableBiMap<K, V> 14160888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends ForwardingMap<K, V> implements BiMap<K, V>, Serializable { 14171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> unmodifiableMap; 14181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final BiMap<? extends K, ? extends V> delegate; 14197dd252788645e940eada959bdde927426e2531c9Paul Duffin BiMap<V, K> inverse; 14201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert transient Set<V> values; 14211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14220888a09821a98ac0680fad765217302858e70fa4Paul Duffin UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate, 14230888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Nullable BiMap<V, K> inverse) { 14241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmodifiableMap = Collections.unmodifiableMap(delegate); 14251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.delegate = delegate; 14261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.inverse = inverse; 14271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14290888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected Map<K, V> delegate() { 14301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return unmodifiableMap; 14311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14330888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 14341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public V forcePut(K key, V value) { 14351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new UnsupportedOperationException(); 14361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14380888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 14391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public BiMap<V, K> inverse() { 14401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BiMap<V, K> result = inverse; 14410888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (result == null) 14420888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? inverse = new UnmodifiableBiMap<V, K>(delegate.inverse(), this) 14431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : result; 14441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14460888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Set<V> values() { 14471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<V> result = values; 14480888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (result == null) 14490888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? values = Collections.unmodifiableSet(delegate.values()) 14500888a09821a98ac0680fad765217302858e70fa4Paul Duffin : result; 14511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 14541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 14571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a view of a map where each value is transformed by a function. All 14581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other properties of the map, such as iteration order, are left intact. For 14591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * example, the code: <pre> {@code 14601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 14611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Map<String, Integer> map = ImmutableMap.of("a", 4, "b", 9); 14621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Function<Integer, Double> sqrt = 14631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * new Function<Integer, Double>() { 14641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * public Double apply(Integer in) { 14651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * return Math.sqrt((int) in); 14661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * } 14671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * }; 14681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Map<String, Double> transformed = Maps.transformValues(map, sqrt); 14691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * System.out.println(transformed);}</pre> 14701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 14711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ... prints {@code {a=2.0, b=3.0}}. 14721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 14731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Changes in the underlying map are reflected in this view. Conversely, 14741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this view supports removal operations, and these are reflected in the 14751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * underlying map. 14761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 14771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>It's acceptable for the underlying map to contain null keys, and even 14781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * null values provided that the function is capable of accepting null input. 14791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * The transformed map might contain null values, if the function sometimes 14801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * gives a null result. 14811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 14821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map is not thread-safe or serializable, even if the 14831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * underlying map is. 14841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 14851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The function is applied lazily, invoked when needed. This is necessary 14861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * for the returned map to be a view, but it means that the function will be 14871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * applied many times for bulk operations like {@link Map#containsValue} and 14881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code Map.toString()}. For this to perform well, {@code function} should 14891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * be fast. To avoid lazy evaluation when the returned map doesn't need to be 14901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a view, copy the returned map into a new map of your choosing. 14911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 14920888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V1, V2> Map<K, V2> transformValues( 14930888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V1> fromMap, Function<? super V1, V2> function) { 14947dd252788645e940eada959bdde927426e2531c9Paul Duffin return transformEntries(fromMap, asEntryTransformer(function)); 14951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 14981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a view of a sorted map where each value is transformed by a 14991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * function. All other properties of the map, such as iteration order, are 15001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * left intact. For example, the code: <pre> {@code 15011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * SortedMap<String, Integer> map = ImmutableSortedMap.of("a", 4, "b", 9); 15031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Function<Integer, Double> sqrt = 15041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * new Function<Integer, Double>() { 15051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * public Double apply(Integer in) { 15061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * return Math.sqrt((int) in); 15071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * } 15081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * }; 15091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * SortedMap<String, Double> transformed = 15100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Maps.transformValues(map, sqrt); 15111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * System.out.println(transformed);}</pre> 15121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ... prints {@code {a=2.0, b=3.0}}. 15141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Changes in the underlying map are reflected in this view. Conversely, 15161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this view supports removal operations, and these are reflected in the 15171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * underlying map. 15181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>It's acceptable for the underlying map to contain null keys, and even 15201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * null values provided that the function is capable of accepting null input. 15211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * The transformed map might contain null values, if the function sometimes 15221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * gives a null result. 15231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map is not thread-safe or serializable, even if the 15251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * underlying map is. 15261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The function is applied lazily, invoked when needed. This is necessary 15281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * for the returned map to be a view, but it means that the function will be 15291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * applied many times for bulk operations like {@link Map#containsValue} and 15301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code Map.toString()}. For this to perform well, {@code function} should 15311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * be fast. To avoid lazy evaluation when the returned map doesn't need to be 15321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a view, copy the returned map into a new map of your choosing. 15331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 15351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 15360888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V1, V2> SortedMap<K, V2> transformValues( 15370888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V1> fromMap, Function<? super V1, V2> function) { 15387dd252788645e940eada959bdde927426e2531c9Paul Duffin return transformEntries(fromMap, asEntryTransformer(function)); 15397dd252788645e940eada959bdde927426e2531c9Paul Duffin } 15407dd252788645e940eada959bdde927426e2531c9Paul Duffin 1541dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin /** 15423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns a view of a navigable map where each value is transformed by a 15433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * function. All other properties of the map, such as iteration order, are 15443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * left intact. For example, the code: <pre> {@code 15453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 15463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableMap<String, Integer> map = Maps.newTreeMap(); 15473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * map.put("a", 4); 15483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * map.put("b", 9); 15493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Function<Integer, Double> sqrt = 15503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * new Function<Integer, Double>() { 15513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * public Double apply(Integer in) { 15523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * return Math.sqrt((int) in); 15533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * } 15543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * }; 15553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableMap<String, Double> transformed = 15563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Maps.transformNavigableValues(map, sqrt); 15573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * System.out.println(transformed);}</pre> 15583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 15593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * ... prints {@code {a=2.0, b=3.0}}. 15603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 15613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Changes in the underlying map are reflected in this view. 15623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Conversely, this view supports removal operations, and these are reflected 15633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * in the underlying map. 15643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 15653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>It's acceptable for the underlying map to contain null keys, and even 15663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * null values provided that the function is capable of accepting null input. 15673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * The transformed map might contain null values, if the function sometimes 15683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * gives a null result. 15693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 15703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The returned map is not thread-safe or serializable, even if the 15713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * underlying map is. 15723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 15733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The function is applied lazily, invoked when needed. This is necessary 15743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * for the returned map to be a view, but it means that the function will be 15753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * applied many times for bulk operations like {@link Map#containsValue} and 15763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * {@code Map.toString()}. For this to perform well, {@code function} should 15773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * be fast. To avoid lazy evaluation when the returned map doesn't need to be 15783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * a view, copy the returned map into a new map of your choosing. 15793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 15803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 13.0 15813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 15823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 15833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public static <K, V1, V2> NavigableMap<K, V2> transformValues( 15843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V1> fromMap, Function<? super V1, V2> function) { 15853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntries(fromMap, asEntryTransformer(function)); 15863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 15873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 15883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 1589dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Returns a view of a map whose values are derived from the original map's 1590dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * entries. In contrast to {@link #transformValues}, this method's 1591dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * entry-transformation logic may depend on the key as well as the value. 15921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>All other properties of the transformed map, such as iteration order, 15941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * are left intact. For example, the code: <pre> {@code 15951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 15961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Map<String, Boolean> options = 1597dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * ImmutableMap.of("verbose", true, "sort", false); 15981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * EntryTransformer<String, Boolean, String> flagPrefixer = 15991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * new EntryTransformer<String, Boolean, String>() { 16001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * public String transformEntry(String key, Boolean value) { 1601dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * return value ? key : "no" + key; 16021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * } 16031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * }; 1604dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Map<String, String> transformed = 1605dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Maps.transformEntries(options, flagPrefixer); 16061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * System.out.println(transformed);}</pre> 16071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1608dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * ... prints {@code {verbose=verbose, sort=nosort}}. 16091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 16101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Changes in the underlying map are reflected in this view. Conversely, 16111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this view supports removal operations, and these are reflected in the 16121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * underlying map. 16131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 16141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>It's acceptable for the underlying map to contain null keys and null 16151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values provided that the transformer is capable of accepting null inputs. 16161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * The transformed map might contain null values if the transformer sometimes 16171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * gives a null result. 16181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 16191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map is not thread-safe or serializable, even if the 16201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * underlying map is. 16211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 16221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The transformer is applied lazily, invoked when needed. This is 16231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * necessary for the returned map to be a view, but it means that the 16241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * transformer will be applied many times for bulk operations like {@link 16251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Map#containsValue} and {@link Object#toString}. For this to perform well, 16261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code transformer} should be fast. To avoid lazy evaluation when the 16271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * returned map doesn't need to be a view, copy the returned map into a new 16281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * map of your choosing. 16291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 16301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> This method assumes that for any instance {@code k} of 16311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies 16321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that {@code k2} is also of type {@code K}. Using an {@code 16331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * EntryTransformer} key type for which this may not hold, such as {@code 16341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * ArrayList}, may risk a {@code ClassCastException} when calling methods on 16351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the transformed map. 16361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1637dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @since 7.0 16381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 16390888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V1, V2> Map<K, V2> transformEntries( 16400888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V1> fromMap, 16413c77433663281544363151bf284b0240dfd22a42Paul Duffin EntryTransformer<? super K, ? super V1, V2> transformer) { 1642dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin if (fromMap instanceof SortedMap) { 1643dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return transformEntries((SortedMap<K, V1>) fromMap, transformer); 1644dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin } 1645dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return new TransformedEntriesMap<K, V1, V2>(fromMap, transformer); 16463c77433663281544363151bf284b0240dfd22a42Paul Duffin } 16473c77433663281544363151bf284b0240dfd22a42Paul Duffin 16483c77433663281544363151bf284b0240dfd22a42Paul Duffin /** 1649dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Returns a view of a sorted map whose values are derived from the original 1650dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * sorted map's entries. In contrast to {@link #transformValues}, this 1651dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * method's entry-transformation logic may depend on the key as well as the 1652dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * value. 16533c77433663281544363151bf284b0240dfd22a42Paul Duffin * 16543c77433663281544363151bf284b0240dfd22a42Paul Duffin * <p>All other properties of the transformed map, such as iteration order, 16553c77433663281544363151bf284b0240dfd22a42Paul Duffin * are left intact. For example, the code: <pre> {@code 16563c77433663281544363151bf284b0240dfd22a42Paul Duffin * 1657dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * Map<String, Boolean> options = 1658dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * ImmutableSortedMap.of("verbose", true, "sort", false); 16593c77433663281544363151bf284b0240dfd22a42Paul Duffin * EntryTransformer<String, Boolean, String> flagPrefixer = 16603c77433663281544363151bf284b0240dfd22a42Paul Duffin * new EntryTransformer<String, Boolean, String>() { 16613c77433663281544363151bf284b0240dfd22a42Paul Duffin * public String transformEntry(String key, Boolean value) { 1662dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * return value ? key : "yes" + key; 16633c77433663281544363151bf284b0240dfd22a42Paul Duffin * } 16643c77433663281544363151bf284b0240dfd22a42Paul Duffin * }; 1665dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * SortedMap<String, String> transformed = 16660888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Maps.transformEntries(options, flagPrefixer); 16673c77433663281544363151bf284b0240dfd22a42Paul Duffin * System.out.println(transformed);}</pre> 16683c77433663281544363151bf284b0240dfd22a42Paul Duffin * 16693c77433663281544363151bf284b0240dfd22a42Paul Duffin * ... prints {@code {sort=yessort, verbose=verbose}}. 16703c77433663281544363151bf284b0240dfd22a42Paul Duffin * 1671dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * <p>Changes in the underlying map are reflected in this view. Conversely, 1672dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * this view supports removal operations, and these are reflected in the 1673dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * underlying map. 16743c77433663281544363151bf284b0240dfd22a42Paul Duffin * 16753c77433663281544363151bf284b0240dfd22a42Paul Duffin * <p>It's acceptable for the underlying map to contain null keys and null 16763c77433663281544363151bf284b0240dfd22a42Paul Duffin * values provided that the transformer is capable of accepting null inputs. 16773c77433663281544363151bf284b0240dfd22a42Paul Duffin * The transformed map might contain null values if the transformer sometimes 16783c77433663281544363151bf284b0240dfd22a42Paul Duffin * gives a null result. 16793c77433663281544363151bf284b0240dfd22a42Paul Duffin * 16803c77433663281544363151bf284b0240dfd22a42Paul Duffin * <p>The returned map is not thread-safe or serializable, even if the 16813c77433663281544363151bf284b0240dfd22a42Paul Duffin * underlying map is. 16823c77433663281544363151bf284b0240dfd22a42Paul Duffin * 16833c77433663281544363151bf284b0240dfd22a42Paul Duffin * <p>The transformer is applied lazily, invoked when needed. This is 16843c77433663281544363151bf284b0240dfd22a42Paul Duffin * necessary for the returned map to be a view, but it means that the 16853c77433663281544363151bf284b0240dfd22a42Paul Duffin * transformer will be applied many times for bulk operations like {@link 16863c77433663281544363151bf284b0240dfd22a42Paul Duffin * Map#containsValue} and {@link Object#toString}. For this to perform well, 16873c77433663281544363151bf284b0240dfd22a42Paul Duffin * {@code transformer} should be fast. To avoid lazy evaluation when the 16883c77433663281544363151bf284b0240dfd22a42Paul Duffin * returned map doesn't need to be a view, copy the returned map into a new 16893c77433663281544363151bf284b0240dfd22a42Paul Duffin * map of your choosing. 16903c77433663281544363151bf284b0240dfd22a42Paul Duffin * 16913c77433663281544363151bf284b0240dfd22a42Paul Duffin * <p><b>Warning:</b> This method assumes that for any instance {@code k} of 16923c77433663281544363151bf284b0240dfd22a42Paul Duffin * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies 16933c77433663281544363151bf284b0240dfd22a42Paul Duffin * that {@code k2} is also of type {@code K}. Using an {@code 16943c77433663281544363151bf284b0240dfd22a42Paul Duffin * EntryTransformer} key type for which this may not hold, such as {@code 16953c77433663281544363151bf284b0240dfd22a42Paul Duffin * ArrayList}, may risk a {@code ClassCastException} when calling methods on 16963c77433663281544363151bf284b0240dfd22a42Paul Duffin * the transformed map. 16973c77433663281544363151bf284b0240dfd22a42Paul Duffin * 1698dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @since 11.0 16993c77433663281544363151bf284b0240dfd22a42Paul Duffin */ 17000888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V1, V2> SortedMap<K, V2> transformEntries( 17010888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V1> fromMap, 17020888a09821a98ac0680fad765217302858e70fa4Paul Duffin EntryTransformer<? super K, ? super V1, V2> transformer) { 17030888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Platform.mapsTransformEntriesSortedMap(fromMap, transformer); 17040888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 17050888a09821a98ac0680fad765217302858e70fa4Paul Duffin 17063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 17073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns a view of a navigable map whose values are derived from the 17083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * original navigable map's entries. In contrast to {@link 17093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * #transformValues}, this method's entry-transformation logic may 17103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * depend on the key as well as the value. 17113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>All other properties of the transformed map, such as iteration order, 17133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * are left intact. For example, the code: <pre> {@code 17143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableMap<String, Boolean> options = Maps.newTreeMap(); 17163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * options.put("verbose", false); 17173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * options.put("sort", true); 17183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * EntryTransformer<String, Boolean, String> flagPrefixer = 17193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * new EntryTransformer<String, Boolean, String>() { 17203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * public String transformEntry(String key, Boolean value) { 17213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * return value ? key : ("yes" + key); 17223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * } 17233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * }; 17243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableMap<String, String> transformed = 17253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * LabsMaps.transformNavigableEntries(options, flagPrefixer); 17263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * System.out.println(transformed);}</pre> 17273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * ... prints {@code {sort=yessort, verbose=verbose}}. 17293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>Changes in the underlying map are reflected in this view. 17313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Conversely, this view supports removal operations, and these are reflected 17323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * in the underlying map. 17333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>It's acceptable for the underlying map to contain null keys and null 17353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * values provided that the transformer is capable of accepting null inputs. 17363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * The transformed map might contain null values if the transformer sometimes 17373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * gives a null result. 17383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The returned map is not thread-safe or serializable, even if the 17403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * underlying map is. 17413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The transformer is applied lazily, invoked when needed. This is 17433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * necessary for the returned map to be a view, but it means that the 17443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * transformer will be applied many times for bulk operations like {@link 17453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Map#containsValue} and {@link Object#toString}. For this to perform well, 17463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * {@code transformer} should be fast. To avoid lazy evaluation when the 17473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * returned map doesn't need to be a view, copy the returned map into a new 17483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * map of your choosing. 17493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> This method assumes that for any instance {@code k} of 17513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * {@code EntryTransformer} key type {@code K}, {@code k.equals(k2)} implies 17523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * that {@code k2} is also of type {@code K}. Using an {@code 17533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * EntryTransformer} key type for which this may not hold, such as {@code 17543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * ArrayList}, may risk a {@code ClassCastException} when calling methods on 17553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * the transformed map. 17563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 17573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 13.0 17583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 17593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 17603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public static <K, V1, V2> NavigableMap<K, V2> transformEntries( 17613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin final NavigableMap<K, V1> fromMap, 17623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin EntryTransformer<? super K, ? super V1, V2> transformer) { 17633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new TransformedEntriesNavigableMap<K, V1, V2>(fromMap, transformer); 17643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 17653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 17660888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V1, V2> SortedMap<K, V2> transformEntriesIgnoreNavigable( 17670888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V1> fromMap, 17681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EntryTransformer<? super K, ? super V1, V2> transformer) { 17691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new TransformedEntriesSortedMap<K, V1, V2>(fromMap, transformer); 17701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 17711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 17721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 17731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A transformation of the value of a key-value pair, using both key and value 17741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * as inputs. To apply the transformation to a map, use 17751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Maps#transformEntries(Map, EntryTransformer)}. 17761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 17771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param <K> the key type of the input and output entries 17781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @paramthe value type of the input entry 17791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param the value type of the output entry 17801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 7.0 17811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 17821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public interface EntryTransformer<K, V1, V2> { 17831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 17841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Determines an output value based on a key-value pair. This method is 17851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <i>generally expected</i>, but not absolutely required, to have the 17861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * following properties: 17871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 17881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <ul> 17891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>Its execution does not cause any observable side effects. 17901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <li>The computation is <i>consistent with equals</i>; that is, 17911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Objects#equal Objects.equal}{@code (k1, k2) &&} 17921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Objects#equal}{@code (v1, v2)} implies that {@code 17931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Objects.equal(transformer.transform(k1, v1), 17941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * transformer.transform(k2, v2))}. 17951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </ul> 17961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 17971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws NullPointerException if the key or value is null and this 17981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * transformer does not accept null arguments 17991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 18001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V2 transformEntry(@Nullable K key, @Nullable V1 value); 18011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 18021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 18030888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 18040888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Views a function as an entry transformer that ignores the entry key. 18050888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 18060888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V1, V2> EntryTransformer<K, V1, V2> 18070888a09821a98ac0680fad765217302858e70fa4Paul Duffin asEntryTransformer(final Function<? super V1, V2> function) { 18080888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(function); 18090888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new EntryTransformer<K, V1, V2>() { 18100888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 18110888a09821a98ac0680fad765217302858e70fa4Paul Duffin public V2 transformEntry(K key, V1 value) { 18120888a09821a98ac0680fad765217302858e70fa4Paul Duffin return function.apply(value); 18130888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18140888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 18150888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 18170888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V1, V2> Function<V1, V2> asValueToValueFunction( 18180888a09821a98ac0680fad765217302858e70fa4Paul Duffin final EntryTransformer<? super K, V1, V2> transformer, final K key) { 18190888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(transformer); 18200888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new Function<V1, V2>() { 18210888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 18220888a09821a98ac0680fad765217302858e70fa4Paul Duffin public V2 apply(@Nullable V1 v1) { 18230888a09821a98ac0680fad765217302858e70fa4Paul Duffin return transformer.transformEntry(key, v1); 18240888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18250888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 18260888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18270888a09821a98ac0680fad765217302858e70fa4Paul Duffin 18280888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 18290888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Views an entry transformer as a function from {@code Entry} to values. 18300888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 18310888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V1, V2> Function<Entry<K, V1>, V2> asEntryToValueFunction( 18320888a09821a98ac0680fad765217302858e70fa4Paul Duffin final EntryTransformer<? super K, ? super V1, V2> transformer) { 18330888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(transformer); 18340888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new Function<Entry<K, V1>, V2>() { 18350888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 18360888a09821a98ac0680fad765217302858e70fa4Paul Duffin public V2 apply(Entry<K, V1> entry) { 18370888a09821a98ac0680fad765217302858e70fa4Paul Duffin return transformer.transformEntry(entry.getKey(), entry.getValue()); 18380888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18390888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 18400888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18410888a09821a98ac0680fad765217302858e70fa4Paul Duffin 18420888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 18430888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Returns a view of an entry transformed by the specified transformer. 18440888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 18450888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <V2, K, V1> Entry<K, V2> transformEntry( 18460888a09821a98ac0680fad765217302858e70fa4Paul Duffin final EntryTransformer<? super K, ? super V1, V2> transformer, final Entry<K, V1> entry) { 18470888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(transformer); 18480888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(entry); 18490888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new AbstractMapEntry<K, V2>() { 18500888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 18510888a09821a98ac0680fad765217302858e70fa4Paul Duffin public K getKey() { 18520888a09821a98ac0680fad765217302858e70fa4Paul Duffin return entry.getKey(); 18530888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18540888a09821a98ac0680fad765217302858e70fa4Paul Duffin 18550888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 18560888a09821a98ac0680fad765217302858e70fa4Paul Duffin public V2 getValue() { 18570888a09821a98ac0680fad765217302858e70fa4Paul Duffin return transformer.transformEntry(entry.getKey(), entry.getValue()); 18580888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18590888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 18600888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18610888a09821a98ac0680fad765217302858e70fa4Paul Duffin 18620888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 18630888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Views an entry transformer as a function from entries to entries. 18640888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 18650888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V1, V2> Function<Entry<K, V1>, Entry<K, V2>> asEntryToEntryFunction( 18660888a09821a98ac0680fad765217302858e70fa4Paul Duffin final EntryTransformer<? super K, ? super V1, V2> transformer) { 18670888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(transformer); 18680888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new Function<Entry<K, V1>, Entry<K, V2>>() { 18690888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 18700888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Entry<K, V2> apply(final Entry<K, V1> entry) { 18710888a09821a98ac0680fad765217302858e70fa4Paul Duffin return transformEntry(transformer, entry); 18720888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18730888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 18740888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 18750888a09821a98ac0680fad765217302858e70fa4Paul Duffin 18760888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class TransformedEntriesMap<K, V1, V2> 18770888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends ImprovedAbstractMap<K, V2> { 18781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V1> fromMap; 18791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final EntryTransformer<? super K, ? super V1, V2> transformer; 18801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 18810888a09821a98ac0680fad765217302858e70fa4Paul Duffin TransformedEntriesMap( 18820888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V1> fromMap, 18831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EntryTransformer<? super K, ? super V1, V2> transformer) { 18841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.fromMap = checkNotNull(fromMap); 18851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.transformer = checkNotNull(transformer); 18861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 18871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 18880888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int size() { 18891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromMap.size(); 18901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 18911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 18920888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean containsKey(Object key) { 18931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromMap.containsKey(key); 18941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 18951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 18961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // safe as long as the user followed the <b>Warning</b> in the javadoc 18971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 18980888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public V2 get(Object key) { 18991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V1 value = fromMap.get(key); 19000888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (value != null || fromMap.containsKey(key)) 19010888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? transformer.transformEntry((K) key, value) 19020888a09821a98ac0680fad765217302858e70fa4Paul Duffin : null; 19031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // safe as long as the user followed the <b>Warning</b> in the javadoc 19061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 19070888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public V2 remove(Object key) { 19080888a09821a98ac0680fad765217302858e70fa4Paul Duffin return fromMap.containsKey(key) 19090888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? transformer.transformEntry((K) key, fromMap.remove(key)) 19101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : null; 19111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19130888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public void clear() { 19141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fromMap.clear(); 19151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19170888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Set<K> keySet() { 19181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromMap.keySet(); 19191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19217dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 19220888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected Set<Entry<K, V2>> createEntrySet() { 19230888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new EntrySet<K, V2>() { 19240888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override Map<K, V2> map() { 19250888a09821a98ac0680fad765217302858e70fa4Paul Duffin return TransformedEntriesMap.this; 19260888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 19271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19280888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Iterator<Entry<K, V2>> iterator() { 19290888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Iterators.transform(fromMap.entrySet().iterator(), 19300888a09821a98ac0680fad765217302858e70fa4Paul Duffin Maps.<K, V1, V2>asEntryToEntryFunction(transformer)); 19310888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 19320888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 19331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19360888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class TransformedEntriesSortedMap<K, V1, V2> 19370888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends TransformedEntriesMap<K, V1, V2> implements SortedMap<K, V2> { 19381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected SortedMap<K, V1> fromMap() { 19401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (SortedMap<K, V1>) fromMap; 19411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TransformedEntriesSortedMap(SortedMap<K, V1> fromMap, 19441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EntryTransformer<? super K, ? super V1, V2> transformer) { 19451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(fromMap, transformer); 19461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19480888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Comparator<? super K> comparator() { 19491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromMap().comparator(); 19501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19520888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public K firstKey() { 19531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromMap().firstKey(); 19541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19560888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V2> headMap(K toKey) { 19571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return transformEntries(fromMap().headMap(toKey), transformer); 19581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19600888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public K lastKey() { 19611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return fromMap().lastKey(); 19621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19640888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V2> subMap(K fromKey, K toKey) { 19650888a09821a98ac0680fad765217302858e70fa4Paul Duffin return transformEntries( 19660888a09821a98ac0680fad765217302858e70fa4Paul Duffin fromMap().subMap(fromKey, toKey), transformer); 19671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 19690888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V2> tailMap(K fromKey) { 19701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return transformEntries(fromMap().tailMap(fromKey), transformer); 19711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 19727dd252788645e940eada959bdde927426e2531c9Paul Duffin } 19737dd252788645e940eada959bdde927426e2531c9Paul Duffin 19743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 19753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private static class TransformedEntriesNavigableMap<K, V1, V2> 19763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin extends TransformedEntriesSortedMap<K, V1, V2> 19773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin implements NavigableMap<K, V2> { 19783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 19793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin TransformedEntriesNavigableMap(NavigableMap<K, V1> fromMap, 19803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin EntryTransformer<? super K, ? super V1, V2> transformer) { 19813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin super(fromMap, transformer); 19823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 19833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 19843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public Entry<K, V2> ceilingEntry(K key) { 19853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntry(fromMap().ceilingEntry(key)); 19863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 19873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 19883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public K ceilingKey(K key) { 19893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return fromMap().ceilingKey(key); 19903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 19913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 19923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableSet<K> descendingKeySet() { 19933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return fromMap().descendingKeySet(); 19943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 19953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 19963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableMap<K, V2> descendingMap() { 19973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntries(fromMap().descendingMap(), transformer); 19983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 19993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public Entry<K, V2> firstEntry() { 20013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntry(fromMap().firstEntry()); 20023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public Entry<K, V2> floorEntry(K key) { 20043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntry(fromMap().floorEntry(key)); 20053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public K floorKey(K key) { 20083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return fromMap().floorKey(key); 20093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableMap<K, V2> headMap(K toKey) { 20123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return headMap(toKey, false); 20133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableMap<K, V2> headMap(K toKey, boolean inclusive) { 20163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntries( 20173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin fromMap().headMap(toKey, inclusive), transformer); 20183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public Entry<K, V2> higherEntry(K key) { 20213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntry(fromMap().higherEntry(key)); 20223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public K higherKey(K key) { 20253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return fromMap().higherKey(key); 20263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public Entry<K, V2> lastEntry() { 20293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntry(fromMap().lastEntry()); 20303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public Entry<K, V2> lowerEntry(K key) { 20333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntry(fromMap().lowerEntry(key)); 20343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public K lowerKey(K key) { 20373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return fromMap().lowerKey(key); 20383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableSet<K> navigableKeySet() { 20413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return fromMap().navigableKeySet(); 20423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public Entry<K, V2> pollFirstEntry() { 20453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntry(fromMap().pollFirstEntry()); 20463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public Entry<K, V2> pollLastEntry() { 20493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntry(fromMap().pollLastEntry()); 20503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableMap<K, V2> subMap( 20533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { 20543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntries( 20553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin fromMap().subMap(fromKey, fromInclusive, toKey, toInclusive), 20563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin transformer); 20573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableMap<K, V2> subMap(K fromKey, K toKey) { 20603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return subMap(fromKey, true, toKey, false); 20613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableMap<K, V2> tailMap(K fromKey) { 20643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return tailMap(fromKey, true); 20653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override public NavigableMap<K, V2> tailMap(K fromKey, boolean inclusive) { 20683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return transformEntries( 20693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin fromMap().tailMap(fromKey, inclusive), transformer); 20703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Nullable 20733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private Entry<K, V2> transformEntry(@Nullable Entry<K, V1> entry) { 20743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return (entry == null) ? null : Maps.transformEntry(transformer, entry); 20753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override protected NavigableMap<K, V1> fromMap() { 20783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return (NavigableMap<K, V1>) super.fromMap(); 20793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 20813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 20820888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K> Predicate<Entry<K, ?>> keyPredicateOnEntries(Predicate<? super K> keyPredicate) { 20830888a09821a98ac0680fad765217302858e70fa4Paul Duffin return compose(keyPredicate, Maps.<K>keyFunction()); 20847dd252788645e940eada959bdde927426e2531c9Paul Duffin } 20857dd252788645e940eada959bdde927426e2531c9Paul Duffin 20860888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <V> Predicate<Entry<?, V>> valuePredicateOnEntries(Predicate<? super V> valuePredicate) { 20870888a09821a98ac0680fad765217302858e70fa4Paul Duffin return compose(valuePredicate, Maps.<V>valueFunction()); 20881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 20891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 20901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 20911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a map containing the mappings in {@code unfiltered} whose keys 20921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * satisfy a predicate. The returned map is a live view of {@code unfiltered}; 20931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * changes to one affect the other. 20941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 20951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 20961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values()} views have iterators that don't support {@code remove()}, but all 20971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other methods are supported by the map and its views. When given a key that 20981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()} 20991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * methods throw an {@link IllegalArgumentException}. 21001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>When methods such as {@code removeAll()} and {@code clear()} are called 21021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on the filtered map or its views, only mappings whose keys satisfy the 21031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * filter will be removed from the underlying map. 21041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map isn't threadsafe or serializable, even if {@code 21061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unfiltered} is. 21071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Many of the filtered map's methods, such as {@code size()}, 21091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * iterate across every key/value mapping in the underlying map and determine 21101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which satisfy the filter. When a live view is <i>not</i> needed, it may be 21111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * faster to copy the filtered map and use the copy. 21121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with 21141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * equals</i>, as documented at {@link Predicate#apply}. Do not provide a 21151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is 21161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * inconsistent with equals. 21171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 21180888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> Map<K, V> filterKeys( 21190888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> unfiltered, final Predicate<? super K> keyPredicate) { 21201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (unfiltered instanceof SortedMap) { 21211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return filterKeys((SortedMap<K, V>) unfiltered, keyPredicate); 21227dd252788645e940eada959bdde927426e2531c9Paul Duffin } else if (unfiltered instanceof BiMap) { 21237dd252788645e940eada959bdde927426e2531c9Paul Duffin return filterKeys((BiMap<K, V>) unfiltered, keyPredicate); 21241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 21251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(keyPredicate); 21260888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<Entry<K, ?>> entryPredicate = keyPredicateOnEntries(keyPredicate); 21270888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (unfiltered instanceof AbstractFilteredMap) 21280888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? filterFiltered((AbstractFilteredMap<K, V>) unfiltered, entryPredicate) 21290888a09821a98ac0680fad765217302858e70fa4Paul Duffin : new FilteredKeyMap<K, V>( 21300888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(unfiltered), keyPredicate, entryPredicate); 21311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 21321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 21331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 21341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a sorted map containing the mappings in {@code unfiltered} whose 21351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * keys satisfy a predicate. The returned map is a live view of {@code 21361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unfiltered}; changes to one affect the other. 21371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 21391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values()} views have iterators that don't support {@code remove()}, but all 21401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other methods are supported by the map and its views. When given a key that 21411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()} 21421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * methods throw an {@link IllegalArgumentException}. 21431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>When methods such as {@code removeAll()} and {@code clear()} are called 21451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on the filtered map or its views, only mappings whose keys satisfy the 21461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * filter will be removed from the underlying map. 21471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map isn't threadsafe or serializable, even if {@code 21491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unfiltered} is. 21501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Many of the filtered map's methods, such as {@code size()}, 21521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * iterate across every key/value mapping in the underlying map and determine 21531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which satisfy the filter. When a live view is <i>not</i> needed, it may be 21541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * faster to copy the filtered map and use the copy. 21551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with 21571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * equals</i>, as documented at {@link Predicate#apply}. Do not provide a 21581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is 21591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * inconsistent with equals. 21601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 21611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 21621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 21630888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> SortedMap<K, V> filterKeys( 21640888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) { 21657dd252788645e940eada959bdde927426e2531c9Paul Duffin // TODO(user): Return a subclass of Maps.FilteredKeyMap for slightly better 21661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // performance. 21670888a09821a98ac0680fad765217302858e70fa4Paul Duffin return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate)); 21687dd252788645e940eada959bdde927426e2531c9Paul Duffin } 21697dd252788645e940eada959bdde927426e2531c9Paul Duffin 21707dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 21713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns a navigable map containing the mappings in {@code unfiltered} whose 21723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * keys satisfy a predicate. The returned map is a live view of {@code 21733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * unfiltered}; changes to one affect the other. 21747dd252788645e940eada959bdde927426e2531c9Paul Duffin * 21753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 21763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * values()} views have iterators that don't support {@code remove()}, but all 21773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * other methods are supported by the map and its views. When given a key that 21783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * doesn't satisfy the predicate, the map's {@code put()} and {@code putAll()} 21793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * methods throw an {@link IllegalArgumentException}. 21803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 21813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>When methods such as {@code removeAll()} and {@code clear()} are called 21823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * on the filtered map or its views, only mappings whose keys satisfy the 21833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * filter will be removed from the underlying map. 21843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 21853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The returned map isn't threadsafe or serializable, even if {@code 21863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * unfiltered} is. 21873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 21883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>Many of the filtered map's methods, such as {@code size()}, 21893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * iterate across every key/value mapping in the underlying map and determine 21903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * which satisfy the filter. When a live view is <i>not</i> needed, it may be 21913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * faster to copy the filtered map and use the copy. 21923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 21933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> {@code keyPredicate} must be <i>consistent with 21943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * equals</i>, as documented at {@link Predicate#apply}. Do not provide a 21953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is 21963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * inconsistent with equals. 21973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 21983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 14.0 21993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 22003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 22013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public static <K, V> NavigableMap<K, V> filterKeys( 22023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) { 22033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin // TODO(user): Return a subclass of Maps.FilteredKeyMap for slightly better 22043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin // performance. 22053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate)); 22063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 22073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 22083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 22093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns a bimap containing the mappings in {@code unfiltered} whose keys satisfy a predicate. 22103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * The returned bimap is a live view of {@code unfiltered}; changes to one affect the other. 22113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 22123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have 22133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * iterators that don't support {@code remove()}, but all other methods are supported by the 22143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * bimap and its views. When given a key that doesn't satisfy the predicate, the bimap's {@code 22153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * put()}, {@code forcePut()} and {@code putAll()} methods throw an {@link 22167dd252788645e940eada959bdde927426e2531c9Paul Duffin * IllegalArgumentException}. 22177dd252788645e940eada959bdde927426e2531c9Paul Duffin * 22187dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered 22197dd252788645e940eada959bdde927426e2531c9Paul Duffin * bimap or its views, only mappings that satisfy the filter will be removed from the underlying 22207dd252788645e940eada959bdde927426e2531c9Paul Duffin * bimap. 22217dd252788645e940eada959bdde927426e2531c9Paul Duffin * 22227dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is. 22237dd252788645e940eada959bdde927426e2531c9Paul Duffin * 22247dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every key in 22257dd252788645e940eada959bdde927426e2531c9Paul Duffin * the underlying bimap and determine which satisfy the filter. When a live view is <i>not</i> 22267dd252788645e940eada959bdde927426e2531c9Paul Duffin * needed, it may be faster to copy the filtered bimap and use the copy. 22277dd252788645e940eada959bdde927426e2531c9Paul Duffin * 22287dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as 22297dd252788645e940eada959bdde927426e2531c9Paul Duffin * documented at {@link Predicate#apply}. 22307dd252788645e940eada959bdde927426e2531c9Paul Duffin * 22317dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 14.0 22327dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 22330888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> BiMap<K, V> filterKeys( 22340888a09821a98ac0680fad765217302858e70fa4Paul Duffin BiMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) { 22351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(keyPredicate); 22360888a09821a98ac0680fad765217302858e70fa4Paul Duffin return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate)); 22371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 22381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 22391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 22401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a map containing the mappings in {@code unfiltered} whose values 22411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * satisfy a predicate. The returned map is a live view of {@code unfiltered}; 22421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * changes to one affect the other. 22431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 22451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values()} views have iterators that don't support {@code remove()}, but all 22461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other methods are supported by the map and its views. When given a value 22471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that doesn't satisfy the predicate, the map's {@code put()}, {@code 22481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * putAll()}, and {@link Entry#setValue} methods throw an {@link 22491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * IllegalArgumentException}. 22501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>When methods such as {@code removeAll()} and {@code clear()} are called 22521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on the filtered map or its views, only mappings whose values satisfy the 22531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * filter will be removed from the underlying map. 22541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map isn't threadsafe or serializable, even if {@code 22561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unfiltered} is. 22571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Many of the filtered map's methods, such as {@code size()}, 22591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * iterate across every key/value mapping in the underlying map and determine 22601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which satisfy the filter. When a live view is <i>not</i> needed, it may be 22611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * faster to copy the filtered map and use the copy. 22621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with 22641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * equals</i>, as documented at {@link Predicate#apply}. Do not provide a 22651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is 22661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * inconsistent with equals. 22671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 22680888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> Map<K, V> filterValues( 22690888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> unfiltered, final Predicate<? super V> valuePredicate) { 22701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (unfiltered instanceof SortedMap) { 22711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return filterValues((SortedMap<K, V>) unfiltered, valuePredicate); 22727dd252788645e940eada959bdde927426e2531c9Paul Duffin } else if (unfiltered instanceof BiMap) { 22737dd252788645e940eada959bdde927426e2531c9Paul Duffin return filterValues((BiMap<K, V>) unfiltered, valuePredicate); 22741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 22750888a09821a98ac0680fad765217302858e70fa4Paul Duffin return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate)); 22761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 22771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 22781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 22791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a sorted map containing the mappings in {@code unfiltered} whose 22801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values satisfy a predicate. The returned map is a live view of {@code 22811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unfiltered}; changes to one affect the other. 22821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 22841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values()} views have iterators that don't support {@code remove()}, but all 22851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other methods are supported by the map and its views. When given a value 22861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that doesn't satisfy the predicate, the map's {@code put()}, {@code 22871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * putAll()}, and {@link Entry#setValue} methods throw an {@link 22881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * IllegalArgumentException}. 22891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>When methods such as {@code removeAll()} and {@code clear()} are called 22911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on the filtered map or its views, only mappings whose values satisfy the 22921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * filter will be removed from the underlying map. 22931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map isn't threadsafe or serializable, even if {@code 22951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unfiltered} is. 22961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 22971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Many of the filtered map's methods, such as {@code size()}, 22981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * iterate across every key/value mapping in the underlying map and determine 22991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which satisfy the filter. When a live view is <i>not</i> needed, it may be 23001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * faster to copy the filtered map and use the copy. 23011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 23021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with 23031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * equals</i>, as documented at {@link Predicate#apply}. Do not provide a 23041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is 23051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * inconsistent with equals. 23061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 23071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0 23081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 23090888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> SortedMap<K, V> filterValues( 23100888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) { 23110888a09821a98ac0680fad765217302858e70fa4Paul Duffin return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate)); 23127dd252788645e940eada959bdde927426e2531c9Paul Duffin } 23137dd252788645e940eada959bdde927426e2531c9Paul Duffin 23147dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 23153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns a navigable map containing the mappings in {@code unfiltered} whose 23163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * values satisfy a predicate. The returned map is a live view of {@code 23173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * unfiltered}; changes to one affect the other. 23183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 23193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 23203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * values()} views have iterators that don't support {@code remove()}, but all 23213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * other methods are supported by the map and its views. When given a value 23223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * that doesn't satisfy the predicate, the map's {@code put()}, {@code 23233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * putAll()}, and {@link Entry#setValue} methods throw an {@link 23243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * IllegalArgumentException}. 23253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 23263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>When methods such as {@code removeAll()} and {@code clear()} are called 23273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * on the filtered map or its views, only mappings whose values satisfy the 23283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * filter will be removed from the underlying map. 23293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 23303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The returned map isn't threadsafe or serializable, even if {@code 23313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * unfiltered} is. 23323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 23333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>Many of the filtered map's methods, such as {@code size()}, 23343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * iterate across every key/value mapping in the underlying map and determine 23353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * which satisfy the filter. When a live view is <i>not</i> needed, it may be 23363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * faster to copy the filtered map and use the copy. 23373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 23383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> {@code valuePredicate} must be <i>consistent with 23393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * equals</i>, as documented at {@link Predicate#apply}. Do not provide a 23403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * predicate such as {@code Predicates.instanceOf(ArrayList.class)}, which is 23413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * inconsistent with equals. 23423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 23433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 14.0 23443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 23453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 23463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public static <K, V> NavigableMap<K, V> filterValues( 23473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) { 23483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate)); 23493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 23503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 23513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 23527dd252788645e940eada959bdde927426e2531c9Paul Duffin * Returns a bimap containing the mappings in {@code unfiltered} whose values satisfy a 23537dd252788645e940eada959bdde927426e2531c9Paul Duffin * predicate. The returned bimap is a live view of {@code unfiltered}; changes to one affect the 23547dd252788645e940eada959bdde927426e2531c9Paul Duffin * other. 23557dd252788645e940eada959bdde927426e2531c9Paul Duffin * 23567dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have 23577dd252788645e940eada959bdde927426e2531c9Paul Duffin * iterators that don't support {@code remove()}, but all other methods are supported by the 23587dd252788645e940eada959bdde927426e2531c9Paul Duffin * bimap and its views. When given a value that doesn't satisfy the predicate, the bimap's 23597dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code put()}, {@code forcePut()} and {@code putAll()} methods throw an {@link 23607dd252788645e940eada959bdde927426e2531c9Paul Duffin * IllegalArgumentException}. Similarly, the map's entries have a {@link Entry#setValue} method 23617dd252788645e940eada959bdde927426e2531c9Paul Duffin * that throws an {@link IllegalArgumentException} when the provided value doesn't satisfy the 23627dd252788645e940eada959bdde927426e2531c9Paul Duffin * predicate. 23637dd252788645e940eada959bdde927426e2531c9Paul Duffin * 23647dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered 23657dd252788645e940eada959bdde927426e2531c9Paul Duffin * bimap or its views, only mappings that satisfy the filter will be removed from the underlying 23667dd252788645e940eada959bdde927426e2531c9Paul Duffin * bimap. 23677dd252788645e940eada959bdde927426e2531c9Paul Duffin * 23687dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is. 23697dd252788645e940eada959bdde927426e2531c9Paul Duffin * 23707dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every value in 23717dd252788645e940eada959bdde927426e2531c9Paul Duffin * the underlying bimap and determine which satisfy the filter. When a live view is <i>not</i> 23727dd252788645e940eada959bdde927426e2531c9Paul Duffin * needed, it may be faster to copy the filtered bimap and use the copy. 23737dd252788645e940eada959bdde927426e2531c9Paul Duffin * 23747dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as 23757dd252788645e940eada959bdde927426e2531c9Paul Duffin * documented at {@link Predicate#apply}. 23767dd252788645e940eada959bdde927426e2531c9Paul Duffin * 23777dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 14.0 23787dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 23790888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> BiMap<K, V> filterValues( 23800888a09821a98ac0680fad765217302858e70fa4Paul Duffin BiMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) { 23810888a09821a98ac0680fad765217302858e70fa4Paul Duffin return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate)); 23821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 23831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 23841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 23851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a map containing the mappings in {@code unfiltered} that satisfy a 23861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * predicate. The returned map is a live view of {@code unfiltered}; changes 23871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to one affect the other. 23881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 23891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 23901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values()} views have iterators that don't support {@code remove()}, but all 23911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other methods are supported by the map and its views. When given a 23921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * key/value pair that doesn't satisfy the predicate, the map's {@code put()} 23931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and {@code putAll()} methods throw an {@link IllegalArgumentException}. 23941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Similarly, the map's entries have a {@link Entry#setValue} method that 23951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * throws an {@link IllegalArgumentException} when the existing key and the 23961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * provided value don't satisfy the predicate. 23971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 23981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>When methods such as {@code removeAll()} and {@code clear()} are called 23991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on the filtered map or its views, only mappings that satisfy the filter 24001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * will be removed from the underlying map. 24011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 24021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map isn't threadsafe or serializable, even if {@code 24031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unfiltered} is. 24041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 24051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Many of the filtered map's methods, such as {@code size()}, 24061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * iterate across every key/value mapping in the underlying map and determine 24071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which satisfy the filter. When a live view is <i>not</i> needed, it may be 24081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * faster to copy the filtered map and use the copy. 24091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 24101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with 24111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * equals</i>, as documented at {@link Predicate#apply}. 24121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 24130888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> Map<K, V> filterEntries( 24140888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) { 24151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (unfiltered instanceof SortedMap) { 2416dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin return filterEntries((SortedMap<K, V>) unfiltered, entryPredicate); 24177dd252788645e940eada959bdde927426e2531c9Paul Duffin } else if (unfiltered instanceof BiMap) { 24187dd252788645e940eada959bdde927426e2531c9Paul Duffin return filterEntries((BiMap<K, V>) unfiltered, entryPredicate); 2419dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin } 24203c77433663281544363151bf284b0240dfd22a42Paul Duffin checkNotNull(entryPredicate); 24210888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (unfiltered instanceof AbstractFilteredMap) 24220888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? filterFiltered((AbstractFilteredMap<K, V>) unfiltered, entryPredicate) 24230888a09821a98ac0680fad765217302858e70fa4Paul Duffin : new FilteredEntryMap<K, V>(checkNotNull(unfiltered), entryPredicate); 24241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 24251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 24261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 24271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a sorted map containing the mappings in {@code unfiltered} that 24281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * satisfy a predicate. The returned map is a live view of {@code unfiltered}; 24291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * changes to one affect the other. 24301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 24311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 24321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * values()} views have iterators that don't support {@code remove()}, but all 24331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other methods are supported by the map and its views. When given a 24341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * key/value pair that doesn't satisfy the predicate, the map's {@code put()} 24351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * and {@code putAll()} methods throw an {@link IllegalArgumentException}. 24361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Similarly, the map's entries have a {@link Entry#setValue} method that 24371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * throws an {@link IllegalArgumentException} when the existing key and the 24381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * provided value don't satisfy the predicate. 24391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 24401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>When methods such as {@code removeAll()} and {@code clear()} are called 24411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on the filtered map or its views, only mappings that satisfy the filter 24421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * will be removed from the underlying map. 24431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 24441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The returned map isn't threadsafe or serializable, even if {@code 24451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * unfiltered} is. 24461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 24471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Many of the filtered map's methods, such as {@code size()}, 24481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * iterate across every key/value mapping in the underlying map and determine 24491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which satisfy the filter. When a live view is <i>not</i> needed, it may be 24501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * faster to copy the filtered map and use the copy. 24511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 24521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with 24531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * equals</i>, as documented at {@link Predicate#apply}. 24541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2455dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin * @since 11.0 24561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 24570888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> SortedMap<K, V> filterEntries( 24580888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> unfiltered, 24590888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<? super Entry<K, V>> entryPredicate) { 24600888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Platform.mapsFilterSortedMap(unfiltered, entryPredicate); 24610888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 24620888a09821a98ac0680fad765217302858e70fa4Paul Duffin 24630888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> SortedMap<K, V> filterSortedIgnoreNavigable( 24640888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> unfiltered, 24651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Predicate<? super Entry<K, V>> entryPredicate) { 24661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(entryPredicate); 24670888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (unfiltered instanceof FilteredEntrySortedMap) 24680888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? filterFiltered((FilteredEntrySortedMap<K, V>) unfiltered, entryPredicate) 2469dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin : new FilteredEntrySortedMap<K, V>(checkNotNull(unfiltered), entryPredicate); 24701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 24711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 24721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 24733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns a sorted map containing the mappings in {@code unfiltered} that 24743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * satisfy a predicate. The returned map is a live view of {@code unfiltered}; 24753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * changes to one affect the other. 24763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 24773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The resulting map's {@code keySet()}, {@code entrySet()}, and {@code 24783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * values()} views have iterators that don't support {@code remove()}, but all 24793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * other methods are supported by the map and its views. When given a 24803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * key/value pair that doesn't satisfy the predicate, the map's {@code put()} 24813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * and {@code putAll()} methods throw an {@link IllegalArgumentException}. 24823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Similarly, the map's entries have a {@link Entry#setValue} method that 24833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * throws an {@link IllegalArgumentException} when the existing key and the 24843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * provided value don't satisfy the predicate. 24853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 24863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>When methods such as {@code removeAll()} and {@code clear()} are called 24873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * on the filtered map or its views, only mappings that satisfy the filter 24883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * will be removed from the underlying map. 24893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 24903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The returned map isn't threadsafe or serializable, even if {@code 24913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * unfiltered} is. 24923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 24933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>Many of the filtered map's methods, such as {@code size()}, 24943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * iterate across every key/value mapping in the underlying map and determine 24953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * which satisfy the filter. When a live view is <i>not</i> needed, it may be 24963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * faster to copy the filtered map and use the copy. 24973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 24983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with 24993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * equals</i>, as documented at {@link Predicate#apply}. 25003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 25013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 14.0 25023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 25033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 25043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public static <K, V> NavigableMap<K, V> filterEntries( 25053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> unfiltered, 25063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Predicate<? super Entry<K, V>> entryPredicate) { 25073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin checkNotNull(entryPredicate); 25083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return (unfiltered instanceof FilteredEntryNavigableMap) 25093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin ? filterFiltered((FilteredEntryNavigableMap<K, V>) unfiltered, entryPredicate) 25103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin : new FilteredEntryNavigableMap<K, V>(checkNotNull(unfiltered), entryPredicate); 25113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 25123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 25133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 25147dd252788645e940eada959bdde927426e2531c9Paul Duffin * Returns a bimap containing the mappings in {@code unfiltered} that satisfy a predicate. The 25157dd252788645e940eada959bdde927426e2531c9Paul Duffin * returned bimap is a live view of {@code unfiltered}; changes to one affect the other. 25167dd252788645e940eada959bdde927426e2531c9Paul Duffin * 25177dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The resulting bimap's {@code keySet()}, {@code entrySet()}, and {@code values()} views have 25187dd252788645e940eada959bdde927426e2531c9Paul Duffin * iterators that don't support {@code remove()}, but all other methods are supported by the bimap 25197dd252788645e940eada959bdde927426e2531c9Paul Duffin * and its views. When given a key/value pair that doesn't satisfy the predicate, the bimap's 25207dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@code put()}, {@code forcePut()} and {@code putAll()} methods throw an 25217dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@link IllegalArgumentException}. Similarly, the map's entries have an {@link Entry#setValue} 25227dd252788645e940eada959bdde927426e2531c9Paul Duffin * method that throws an {@link IllegalArgumentException} when the existing key and the provided 25237dd252788645e940eada959bdde927426e2531c9Paul Duffin * value don't satisfy the predicate. 25247dd252788645e940eada959bdde927426e2531c9Paul Duffin * 25257dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>When methods such as {@code removeAll()} and {@code clear()} are called on the filtered 25267dd252788645e940eada959bdde927426e2531c9Paul Duffin * bimap or its views, only mappings that satisfy the filter will be removed from the underlying 25277dd252788645e940eada959bdde927426e2531c9Paul Duffin * bimap. 25287dd252788645e940eada959bdde927426e2531c9Paul Duffin * 25297dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>The returned bimap isn't threadsafe or serializable, even if {@code unfiltered} is. 25307dd252788645e940eada959bdde927426e2531c9Paul Duffin * 25317dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>Many of the filtered bimap's methods, such as {@code size()}, iterate across every 25327dd252788645e940eada959bdde927426e2531c9Paul Duffin * key/value mapping in the underlying bimap and determine which satisfy the filter. When a live 25337dd252788645e940eada959bdde927426e2531c9Paul Duffin * view is <i>not</i> needed, it may be faster to copy the filtered bimap and use the copy. 25347dd252788645e940eada959bdde927426e2531c9Paul Duffin * 25357dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals </i>, as 25367dd252788645e940eada959bdde927426e2531c9Paul Duffin * documented at {@link Predicate#apply}. 25377dd252788645e940eada959bdde927426e2531c9Paul Duffin * 25387dd252788645e940eada959bdde927426e2531c9Paul Duffin * @since 14.0 25397dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 25400888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <K, V> BiMap<K, V> filterEntries( 25410888a09821a98ac0680fad765217302858e70fa4Paul Duffin BiMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) { 25427dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(unfiltered); 25437dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(entryPredicate); 25440888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (unfiltered instanceof FilteredEntryBiMap) 25450888a09821a98ac0680fad765217302858e70fa4Paul Duffin ? filterFiltered((FilteredEntryBiMap<K, V>) unfiltered, entryPredicate) 25460888a09821a98ac0680fad765217302858e70fa4Paul Duffin : new FilteredEntryBiMap<K, V>(unfiltered, entryPredicate); 25477dd252788645e940eada959bdde927426e2531c9Paul Duffin } 25487dd252788645e940eada959bdde927426e2531c9Paul Duffin 25497dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 25501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when 25511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * filtering a filtered map. 25521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 25531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <K, V> Map<K, V> filterFiltered(AbstractFilteredMap<K, V> map, 25541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Predicate<? super Entry<K, V>> entryPredicate) { 25550888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new FilteredEntryMap<K, V>(map.unfiltered, 25560888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicates.<Entry<K, V>>and(map.predicate, entryPredicate)); 25571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 25581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25590888a09821a98ac0680fad765217302858e70fa4Paul Duffin private abstract static class AbstractFilteredMap<K, V> 25600888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends ImprovedAbstractMap<K, V> { 25611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> unfiltered; 25621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Predicate<? super Entry<K, V>> predicate; 25631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25640888a09821a98ac0680fad765217302858e70fa4Paul Duffin AbstractFilteredMap( 25650888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> unfiltered, Predicate<? super Entry<K, V>> predicate) { 25661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.unfiltered = unfiltered; 25671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.predicate = predicate; 25681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 25691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25700888a09821a98ac0680fad765217302858e70fa4Paul Duffin boolean apply(@Nullable Object key, @Nullable V value) { 25711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // This method is called only when the key is in the map, implying that 25721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // key is a K. 25731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 25741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K k = (K) key; 25751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return predicate.apply(Maps.immutableEntry(k, value)); 25761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 25771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25780888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public V put(K key, V value) { 25791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkArgument(apply(key, value)); 25801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return unfiltered.put(key, value); 25811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 25821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25830888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public void putAll(Map<? extends K, ? extends V> map) { 25841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<? extends K, ? extends V> entry : map.entrySet()) { 25851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkArgument(apply(entry.getKey(), entry.getValue())); 25861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 25871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.putAll(map); 25881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 25891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25900888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean containsKey(Object key) { 25911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return unfiltered.containsKey(key) && apply(key, unfiltered.get(key)); 25921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 25931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25940888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public V get(Object key) { 25951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V value = unfiltered.get(key); 25961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ((value != null) && apply(key, value)) ? value : null; 25971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 25981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25990888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean isEmpty() { 26001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return entrySet().isEmpty(); 26011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 26021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 26030888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public V remove(Object key) { 26041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return containsKey(key) ? unfiltered.remove(key) : null; 26051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 26061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 26070888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 26080888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<V> createValues() { 26090888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new FilteredMapValues<K, V>(this, unfiltered, predicate); 26100888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26110888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26120888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26130888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static final class FilteredMapValues<K, V> extends Maps.Values<K, V> { 26140888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> unfiltered; 26150888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<? super Entry<K, V>> predicate; 26160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26170888a09821a98ac0680fad765217302858e70fa4Paul Duffin FilteredMapValues(Map<K, V> filteredMap, Map<K, V> unfiltered, 26180888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<? super Entry<K, V>> predicate) { 26190888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(filteredMap); 26200888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.unfiltered = unfiltered; 26210888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.predicate = predicate; 26220888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26230888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26240888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean remove(Object o) { 26250888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Iterables.removeFirstMatching(unfiltered.entrySet(), 26260888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicates.<Entry<K, V>>and(predicate, Maps.<V>valuePredicateOnEntries(equalTo(o)))) 26270888a09821a98ac0680fad765217302858e70fa4Paul Duffin != null; 26280888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26290888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26300888a09821a98ac0680fad765217302858e70fa4Paul Duffin private boolean removeIf(Predicate<? super V> valuePredicate) { 26310888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Iterables.removeIf(unfiltered.entrySet(), Predicates.<Entry<K, V>>and( 26320888a09821a98ac0680fad765217302858e70fa4Paul Duffin predicate, Maps.<V>valuePredicateOnEntries(valuePredicate))); 26330888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26340888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26350888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean removeAll(Collection<?> collection) { 26360888a09821a98ac0680fad765217302858e70fa4Paul Duffin return removeIf(in(collection)); 26370888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26380888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26390888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean retainAll(Collection<?> collection) { 26400888a09821a98ac0680fad765217302858e70fa4Paul Duffin return removeIf(not(in(collection))); 26410888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26420888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26430888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Object[] toArray() { 26440888a09821a98ac0680fad765217302858e70fa4Paul Duffin // creating an ArrayList so filtering happens once 26450888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Lists.newArrayList(iterator()).toArray(); 26460888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26470888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26480888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public <T> T[] toArray(T[] array) { 26490888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Lists.newArrayList(iterator()).toArray(array); 26500888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26510888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26520888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26530888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static class FilteredKeyMap<K, V> extends AbstractFilteredMap<K, V> { 26540888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<? super K> keyPredicate; 26550888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26560888a09821a98ac0680fad765217302858e70fa4Paul Duffin FilteredKeyMap(Map<K, V> unfiltered, Predicate<? super K> keyPredicate, 26570888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<? super Entry<K, V>> entryPredicate) { 26580888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(unfiltered, entryPredicate); 26590888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.keyPredicate = keyPredicate; 26600888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 26627dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 26630888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected Set<Entry<K, V>> createEntrySet() { 26640888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Sets.filter(unfiltered.entrySet(), predicate); 26651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 26661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 26670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 26680888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<K> createKeySet() { 26690888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Sets.filter(unfiltered.keySet(), keyPredicate); 26700888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26717dd252788645e940eada959bdde927426e2531c9Paul Duffin 26720888a09821a98ac0680fad765217302858e70fa4Paul Duffin // The cast is called only when the key is in the unfiltered map, implying 26730888a09821a98ac0680fad765217302858e70fa4Paul Duffin // that key is a K. 26740888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 26750888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 26760888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean containsKey(Object key) { 26770888a09821a98ac0680fad765217302858e70fa4Paul Duffin return unfiltered.containsKey(key) && keyPredicate.apply((K) key); 26780888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26790888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 26810888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class FilteredEntryMap<K, V> extends AbstractFilteredMap<K, V> { 26820888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 26830888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Entries in this set satisfy the predicate, but they don't validate the 26840888a09821a98ac0680fad765217302858e70fa4Paul Duffin * input to {@code Entry.setValue()}. 26850888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 26860888a09821a98ac0680fad765217302858e70fa4Paul Duffin final Set<Entry<K, V>> filteredEntrySet; 26871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 26880888a09821a98ac0680fad765217302858e70fa4Paul Duffin FilteredEntryMap( 26890888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) { 26900888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(unfiltered, entryPredicate); 26910888a09821a98ac0680fad765217302858e70fa4Paul Duffin filteredEntrySet = Sets.filter(unfiltered.entrySet(), predicate); 26920888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26930888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26940888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 26950888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected Set<Entry<K, V>> createEntrySet() { 26960888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new EntrySet(); 26970888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 26980888a09821a98ac0680fad765217302858e70fa4Paul Duffin 26990888a09821a98ac0680fad765217302858e70fa4Paul Duffin private class EntrySet extends ForwardingSet<Entry<K, V>> { 27000888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override protected Set<Entry<K, V>> delegate() { 27010888a09821a98ac0680fad765217302858e70fa4Paul Duffin return filteredEntrySet; 27021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27040888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Iterator<Entry<K, V>> iterator() { 27050888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new TransformedIterator<Entry<K, V>, Entry<K, V>>(filteredEntrySet.iterator()) { 27060888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 27070888a09821a98ac0680fad765217302858e70fa4Paul Duffin Entry<K, V> transform(final Entry<K, V> entry) { 27080888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new ForwardingMapEntry<K, V>() { 27090888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 27100888a09821a98ac0680fad765217302858e70fa4Paul Duffin protected Entry<K, V> delegate() { 27110888a09821a98ac0680fad765217302858e70fa4Paul Duffin return entry; 27120888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 27130888a09821a98ac0680fad765217302858e70fa4Paul Duffin 27140888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 27150888a09821a98ac0680fad765217302858e70fa4Paul Duffin public V setValue(V newValue) { 27160888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkArgument(apply(getKey(), newValue)); 27170888a09821a98ac0680fad765217302858e70fa4Paul Duffin return super.setValue(newValue); 27180888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 27190888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 27200888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 27210888a09821a98ac0680fad765217302858e70fa4Paul Duffin }; 27221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27230888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 27241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27250888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 27260888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<K> createKeySet() { 27270888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new KeySet(); 27280888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 27290888a09821a98ac0680fad765217302858e70fa4Paul Duffin 27300888a09821a98ac0680fad765217302858e70fa4Paul Duffin class KeySet extends Maps.KeySet<K, V> { 27310888a09821a98ac0680fad765217302858e70fa4Paul Duffin KeySet() { 27320888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(FilteredEntryMap.this); 27331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27350888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean remove(Object o) { 27360888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (containsKey(o)) { 27370888a09821a98ac0680fad765217302858e70fa4Paul Duffin unfiltered.remove(o); 27380888a09821a98ac0680fad765217302858e70fa4Paul Duffin return true; 27391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 27411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27430888a09821a98ac0680fad765217302858e70fa4Paul Duffin private boolean removeIf(Predicate<? super K> keyPredicate) { 27440888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Iterables.removeIf(unfiltered.entrySet(), Predicates.<Entry<K, V>>and( 27450888a09821a98ac0680fad765217302858e70fa4Paul Duffin predicate, Maps.<K>keyPredicateOnEntries(keyPredicate))); 27461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27487dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 27490888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean removeAll(Collection<?> c) { 27500888a09821a98ac0680fad765217302858e70fa4Paul Duffin return removeIf(in(c)); 27511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27537dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 27540888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean retainAll(Collection<?> c) { 27550888a09821a98ac0680fad765217302858e70fa4Paul Duffin return removeIf(not(in(c))); 27560888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 27570888a09821a98ac0680fad765217302858e70fa4Paul Duffin 27580888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Object[] toArray() { 27591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // creating an ArrayList so filtering happens once 27601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Lists.newArrayList(iterator()).toArray(); 27611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27630888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public <T> T[] toArray(T[] array) { 27641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Lists.newArrayList(iterator()).toArray(array); 27651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27687dd252788645e940eada959bdde927426e2531c9Paul Duffin 27691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 27701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when 27711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * filtering a filtered sorted map. 27721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 27730888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <K, V> SortedMap<K, V> filterFiltered( 27740888a09821a98ac0680fad765217302858e70fa4Paul Duffin FilteredEntrySortedMap<K, V> map, 27751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Predicate<? super Entry<K, V>> entryPredicate) { 27760888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<Entry<K, V>> predicate 27770888a09821a98ac0680fad765217302858e70fa4Paul Duffin = Predicates.and(map.predicate, entryPredicate); 27781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new FilteredEntrySortedMap<K, V>(map.sortedMap(), predicate); 27791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27810888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static class FilteredEntrySortedMap<K, V> 27820888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends FilteredEntryMap<K, V> implements SortedMap<K, V> { 27831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27840888a09821a98ac0680fad765217302858e70fa4Paul Duffin FilteredEntrySortedMap(SortedMap<K, V> unfiltered, 27850888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<? super Entry<K, V>> entryPredicate) { 27861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(unfiltered, entryPredicate); 27871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedMap<K, V> sortedMap() { 27901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (SortedMap<K, V>) unfiltered; 27911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 27921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 27930888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedSet<K> keySet() { 27940888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (SortedSet<K>) super.keySet(); 27950888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 27960888a09821a98ac0680fad765217302858e70fa4Paul Duffin 27970888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 27980888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedSet<K> createKeySet() { 27990888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SortedKeySet(); 28000888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 28010888a09821a98ac0680fad765217302858e70fa4Paul Duffin 28020888a09821a98ac0680fad765217302858e70fa4Paul Duffin class SortedKeySet extends KeySet implements SortedSet<K> { 28030888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 28040888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Comparator<? super K> comparator() { 28050888a09821a98ac0680fad765217302858e70fa4Paul Duffin return sortedMap().comparator(); 28060888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 28070888a09821a98ac0680fad765217302858e70fa4Paul Duffin 28080888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 28090888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedSet<K> subSet(K fromElement, K toElement) { 28100888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (SortedSet<K>) subMap(fromElement, toElement).keySet(); 28110888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 28120888a09821a98ac0680fad765217302858e70fa4Paul Duffin 28130888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 28140888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedSet<K> headSet(K toElement) { 28150888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (SortedSet<K>) headMap(toElement).keySet(); 28160888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 28170888a09821a98ac0680fad765217302858e70fa4Paul Duffin 28180888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 28190888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedSet<K> tailSet(K fromElement) { 28200888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (SortedSet<K>) tailMap(fromElement).keySet(); 28210888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 28220888a09821a98ac0680fad765217302858e70fa4Paul Duffin 28230888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 28240888a09821a98ac0680fad765217302858e70fa4Paul Duffin public K first() { 28250888a09821a98ac0680fad765217302858e70fa4Paul Duffin return firstKey(); 28260888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 28270888a09821a98ac0680fad765217302858e70fa4Paul Duffin 28280888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 28290888a09821a98ac0680fad765217302858e70fa4Paul Duffin public K last() { 28300888a09821a98ac0680fad765217302858e70fa4Paul Duffin return lastKey(); 28310888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 28320888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 28330888a09821a98ac0680fad765217302858e70fa4Paul Duffin 28340888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Comparator<? super K> comparator() { 28351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return sortedMap().comparator(); 28361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 28371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 28380888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public K firstKey() { 28391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // correctly throws NoSuchElementException when filtered map is empty. 28401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return keySet().iterator().next(); 28411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 28421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 28430888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public K lastKey() { 28441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedMap<K, V> headMap = sortedMap(); 28451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (true) { 28461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // correctly throws NoSuchElementException when filtered map is empty. 28471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K key = headMap.lastKey(); 28481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (apply(key, unfiltered.get(key))) { 28491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return key; 28501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 28511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert headMap = sortedMap().headMap(key); 28521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 28531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 28541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 28550888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V> headMap(K toKey) { 28561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new FilteredEntrySortedMap<K, V>(sortedMap().headMap(toKey), predicate); 28571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 28581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 28590888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V> subMap(K fromKey, K toKey) { 28600888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new FilteredEntrySortedMap<K, V>( 28610888a09821a98ac0680fad765217302858e70fa4Paul Duffin sortedMap().subMap(fromKey, toKey), predicate); 28627dd252788645e940eada959bdde927426e2531c9Paul Duffin } 28637dd252788645e940eada959bdde927426e2531c9Paul Duffin 28640888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public SortedMap<K, V> tailMap(K fromKey) { 28650888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new FilteredEntrySortedMap<K, V>( 28660888a09821a98ac0680fad765217302858e70fa4Paul Duffin sortedMap().tailMap(fromKey), predicate); 28677dd252788645e940eada959bdde927426e2531c9Paul Duffin } 28687dd252788645e940eada959bdde927426e2531c9Paul Duffin } 28690888a09821a98ac0680fad765217302858e70fa4Paul Duffin 28707dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 28717dd252788645e940eada959bdde927426e2531c9Paul Duffin * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when 28723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * filtering a filtered navigable map. 28733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 28743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 28753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private static <K, V> NavigableMap<K, V> filterFiltered( 28763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin FilteredEntryNavigableMap<K, V> map, 28773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Predicate<? super Entry<K, V>> entryPredicate) { 28783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Predicate<Entry<K, V>> predicate 28793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin = Predicates.and(map.entryPredicate, entryPredicate); 28803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new FilteredEntryNavigableMap<K, V>(map.unfiltered, predicate); 28813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 28823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 28833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 28843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private static class FilteredEntryNavigableMap<K, V> extends AbstractNavigableMap<K, V> { 28853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /* 28863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * It's less code to extend AbstractNavigableMap and forward the filtering logic to 28873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * FilteredEntryMap than to extend FilteredEntrySortedMap and reimplement all the NavigableMap 28883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * methods. 28893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 28903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 28913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private final NavigableMap<K, V> unfiltered; 28923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private final Predicate<? super Entry<K, V>> entryPredicate; 28933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private final Map<K, V> filteredDelegate; 28943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 28953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin FilteredEntryNavigableMap( 28963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) { 28973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin this.unfiltered = checkNotNull(unfiltered); 28983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin this.entryPredicate = entryPredicate; 28993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin this.filteredDelegate = new FilteredEntryMap<K, V>(unfiltered, entryPredicate); 29003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Comparator<? super K> comparator() { 29043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return unfiltered.comparator(); 29053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> navigableKeySet() { 29093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new Maps.NavigableKeySet<K, V>(this) { 29103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public boolean removeAll(Collection<?> c) { 29123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Iterators.removeIf(unfiltered.entrySet().iterator(), 29133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Predicates.<Entry<K, V>>and(entryPredicate, Maps.<K>keyPredicateOnEntries(in(c)))); 29143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public boolean retainAll(Collection<?> c) { 29183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Iterators.removeIf(unfiltered.entrySet().iterator(), Predicates.<Entry<K, V>>and( 29193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin entryPredicate, Maps.<K>keyPredicateOnEntries(not(in(c))))); 29203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin }; 29223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Collection<V> values() { 29263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new FilteredMapValues<K, V>(this, unfiltered, entryPredicate); 29273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Iterator<Entry<K, V>> entryIterator() { 29313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Iterators.filter(unfiltered.entrySet().iterator(), entryPredicate); 29323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Iterator<Entry<K, V>> descendingEntryIterator() { 29363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Iterators.filter(unfiltered.descendingMap().entrySet().iterator(), entryPredicate); 29373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public int size() { 29413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filteredDelegate.size(); 29423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public boolean isEmpty() { 29463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return !Iterables.any(unfiltered.entrySet(), entryPredicate); 29473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Nullable 29513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public V get(@Nullable Object key) { 29523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filteredDelegate.get(key); 29533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public boolean containsKey(@Nullable Object key) { 29573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filteredDelegate.containsKey(key); 29583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public V put(K key, V value) { 29623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filteredDelegate.put(key, value); 29633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public V remove(@Nullable Object key) { 29673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filteredDelegate.remove(key); 29683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public void putAll(Map<? extends K, ? extends V> m) { 29723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin filteredDelegate.putAll(m); 29733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public void clear() { 29773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin filteredDelegate.clear(); 29783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Set<Entry<K, V>> entrySet() { 29823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filteredDelegate.entrySet(); 29833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> pollFirstEntry() { 29873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Iterables.removeFirstMatching(unfiltered.entrySet(), entryPredicate); 29883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> pollLastEntry() { 29923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Iterables.removeFirstMatching(unfiltered.descendingMap().entrySet(), entryPredicate); 29933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 29953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 29963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> descendingMap() { 29973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filterEntries(unfiltered.descendingMap(), entryPredicate); 29983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 29993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 30003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 30013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> subMap( 30023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { 30033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filterEntries( 30043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin unfiltered.subMap(fromKey, fromInclusive, toKey, toInclusive), entryPredicate); 30053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 30063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 30073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 30083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> headMap(K toKey, boolean inclusive) { 30093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filterEntries(unfiltered.headMap(toKey, inclusive), entryPredicate); 30103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 30113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 30123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 30133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) { 30143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return filterEntries(unfiltered.tailMap(fromKey, inclusive), entryPredicate); 30153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 30163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 30173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 30183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 30193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when 30207dd252788645e940eada959bdde927426e2531c9Paul Duffin * filtering a filtered map. 30217dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 30220888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <K, V> BiMap<K, V> filterFiltered( 30230888a09821a98ac0680fad765217302858e70fa4Paul Duffin FilteredEntryBiMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) { 30247dd252788645e940eada959bdde927426e2531c9Paul Duffin Predicate<Entry<K, V>> predicate = Predicates.and(map.predicate, entryPredicate); 30257dd252788645e940eada959bdde927426e2531c9Paul Duffin return new FilteredEntryBiMap<K, V>(map.unfiltered(), predicate); 30267dd252788645e940eada959bdde927426e2531c9Paul Duffin } 30277dd252788645e940eada959bdde927426e2531c9Paul Duffin 30280888a09821a98ac0680fad765217302858e70fa4Paul Duffin static final class FilteredEntryBiMap<K, V> extends FilteredEntryMap<K, V> 30290888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements BiMap<K, V> { 30307dd252788645e940eada959bdde927426e2531c9Paul Duffin private final BiMap<V, K> inverse; 30317dd252788645e940eada959bdde927426e2531c9Paul Duffin 30327dd252788645e940eada959bdde927426e2531c9Paul Duffin private static <K, V> Predicate<Entry<V, K>> inversePredicate( 30337dd252788645e940eada959bdde927426e2531c9Paul Duffin final Predicate<? super Entry<K, V>> forwardPredicate) { 30347dd252788645e940eada959bdde927426e2531c9Paul Duffin return new Predicate<Entry<V, K>>() { 30350888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 30367dd252788645e940eada959bdde927426e2531c9Paul Duffin public boolean apply(Entry<V, K> input) { 30370888a09821a98ac0680fad765217302858e70fa4Paul Duffin return forwardPredicate.apply( 30380888a09821a98ac0680fad765217302858e70fa4Paul Duffin Maps.immutableEntry(input.getValue(), input.getKey())); 30397dd252788645e940eada959bdde927426e2531c9Paul Duffin } 30407dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 30417dd252788645e940eada959bdde927426e2531c9Paul Duffin } 30427dd252788645e940eada959bdde927426e2531c9Paul Duffin 30430888a09821a98ac0680fad765217302858e70fa4Paul Duffin FilteredEntryBiMap(BiMap<K, V> delegate, 30440888a09821a98ac0680fad765217302858e70fa4Paul Duffin Predicate<? super Entry<K, V>> predicate) { 30457dd252788645e940eada959bdde927426e2531c9Paul Duffin super(delegate, predicate); 30460888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.inverse = new FilteredEntryBiMap<V, K>( 30470888a09821a98ac0680fad765217302858e70fa4Paul Duffin delegate.inverse(), inversePredicate(predicate), this); 30487dd252788645e940eada959bdde927426e2531c9Paul Duffin } 30497dd252788645e940eada959bdde927426e2531c9Paul Duffin 30500888a09821a98ac0680fad765217302858e70fa4Paul Duffin private FilteredEntryBiMap( 30510888a09821a98ac0680fad765217302858e70fa4Paul Duffin BiMap<K, V> delegate, Predicate<? super Entry<K, V>> predicate, 30527dd252788645e940eada959bdde927426e2531c9Paul Duffin BiMap<V, K> inverse) { 30537dd252788645e940eada959bdde927426e2531c9Paul Duffin super(delegate, predicate); 30547dd252788645e940eada959bdde927426e2531c9Paul Duffin this.inverse = inverse; 30557dd252788645e940eada959bdde927426e2531c9Paul Duffin } 30567dd252788645e940eada959bdde927426e2531c9Paul Duffin 30577dd252788645e940eada959bdde927426e2531c9Paul Duffin BiMap<K, V> unfiltered() { 30587dd252788645e940eada959bdde927426e2531c9Paul Duffin return (BiMap<K, V>) unfiltered; 30591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 30601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 30610888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 30627dd252788645e940eada959bdde927426e2531c9Paul Duffin public V forcePut(@Nullable K key, @Nullable V value) { 30630888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkArgument(apply(key, value)); 30647dd252788645e940eada959bdde927426e2531c9Paul Duffin return unfiltered().forcePut(key, value); 30657dd252788645e940eada959bdde927426e2531c9Paul Duffin } 30667dd252788645e940eada959bdde927426e2531c9Paul Duffin 30670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 30687dd252788645e940eada959bdde927426e2531c9Paul Duffin public BiMap<V, K> inverse() { 30697dd252788645e940eada959bdde927426e2531c9Paul Duffin return inverse; 30707dd252788645e940eada959bdde927426e2531c9Paul Duffin } 30717dd252788645e940eada959bdde927426e2531c9Paul Duffin 30727dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 30737dd252788645e940eada959bdde927426e2531c9Paul Duffin public Set<V> values() { 30747dd252788645e940eada959bdde927426e2531c9Paul Duffin return inverse.keySet(); 30751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 30761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 30771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 30783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 30793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns an unmodifiable view of the specified navigable map. Query operations on the returned 30803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * map read through to the specified map, and attempts to modify the returned map, whether direct 30813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * or via its views, result in an {@code UnsupportedOperationException}. 30823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 30833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The returned navigable map will be serializable if the specified navigable map is 30843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * serializable. 30853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 30863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @param map the navigable map for which an unmodifiable view is to be returned 30873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @return an unmodifiable view of the specified navigable map 30883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 12.0 30893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 30903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 30913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public static <K, V> NavigableMap<K, V> unmodifiableNavigableMap(NavigableMap<K, V> map) { 30923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin checkNotNull(map); 30933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin if (map instanceof UnmodifiableNavigableMap) { 30943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map; 30953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } else { 30963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new UnmodifiableNavigableMap<K, V>(map); 30973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 30983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 30993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31000888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Nullable private static <K, V> Entry<K, V> unmodifiableOrNull(@Nullable Entry<K, V> entry) { 31010888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (entry == null) ? null : Maps.unmodifiableEntry(entry); 31021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 31031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 31043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 31053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin static class UnmodifiableNavigableMap<K, V> 31063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin extends ForwardingSortedMap<K, V> implements NavigableMap<K, V>, Serializable { 31073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private final NavigableMap<K, V> delegate; 31083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin UnmodifiableNavigableMap(NavigableMap<K, V> delegate) { 31103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin this.delegate = delegate; 31113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin UnmodifiableNavigableMap( 31143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> delegate, UnmodifiableNavigableMap<K, V> descendingMap) { 31153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin this.delegate = delegate; 31163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin this.descendingMap = descendingMap; 31173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin protected SortedMap<K, V> delegate() { 31213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Collections.unmodifiableSortedMap(delegate); 31223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> lowerEntry(K key) { 31263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return unmodifiableOrNull(delegate.lowerEntry(key)); 31273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K lowerKey(K key) { 31313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return delegate.lowerKey(key); 31323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> floorEntry(K key) { 31363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return unmodifiableOrNull(delegate.floorEntry(key)); 31373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K floorKey(K key) { 31413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return delegate.floorKey(key); 31423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> ceilingEntry(K key) { 31463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return unmodifiableOrNull(delegate.ceilingEntry(key)); 31473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K ceilingKey(K key) { 31513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return delegate.ceilingKey(key); 31523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> higherEntry(K key) { 31563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return unmodifiableOrNull(delegate.higherEntry(key)); 31573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K higherKey(K key) { 31613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return delegate.higherKey(key); 31623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> firstEntry() { 31663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return unmodifiableOrNull(delegate.firstEntry()); 31673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> lastEntry() { 31713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return unmodifiableOrNull(delegate.lastEntry()); 31723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public final Entry<K, V> pollFirstEntry() { 31763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin throw new UnsupportedOperationException(); 31773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public final Entry<K, V> pollLastEntry() { 31813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin throw new UnsupportedOperationException(); 31823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private transient UnmodifiableNavigableMap<K, V> descendingMap; 31853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> descendingMap() { 31883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin UnmodifiableNavigableMap<K, V> result = descendingMap; 31893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return (result == null) 31903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin ? descendingMap = new UnmodifiableNavigableMap<K, V>(delegate.descendingMap(), this) 31913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin : result; 31923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 31953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Set<K> keySet() { 31963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return navigableKeySet(); 31973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 31983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 31993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 32003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> navigableKeySet() { 32013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Sets.unmodifiableNavigableSet(delegate.navigableKeySet()); 32023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 32043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 32053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> descendingKeySet() { 32063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Sets.unmodifiableNavigableSet(delegate.descendingKeySet()); 32073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 32093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 32103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedMap<K, V> subMap(K fromKey, K toKey) { 32113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return subMap(fromKey, true, toKey, false); 32123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 32143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 32153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedMap<K, V> headMap(K toKey) { 32163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return headMap(toKey, false); 32173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 32193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 32203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedMap<K, V> tailMap(K fromKey) { 32213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return tailMap(fromKey, true); 32223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 32243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 32253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public 32263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> 32273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { 32283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Maps.unmodifiableNavigableMap(delegate.subMap( 32293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin fromKey, 32303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin fromInclusive, 32313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin toKey, 32323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin toInclusive)); 32333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 32353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 32363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> headMap(K toKey, boolean inclusive) { 32373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Maps.unmodifiableNavigableMap(delegate.headMap(toKey, inclusive)); 32383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 32403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 32413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) { 32423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Maps.unmodifiableNavigableMap(delegate.tailMap(fromKey, inclusive)); 32433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 32463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin /** 32473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Returns a synchronized (thread-safe) navigable map backed by the specified 32483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * navigable map. In order to guarantee serial access, it is critical that 32493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <b>all</b> access to the backing navigable map is accomplished 32503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * through the returned navigable map (or its views). 32513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>It is imperative that the user manually synchronize on the returned 32533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * navigable map when iterating over any of its collection views, or the 32543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * collections views of any of its {@code descendingMap}, {@code subMap}, 32553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * {@code headMap} or {@code tailMap} views. <pre> {@code 32563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableMap<K, V> map = synchronizedNavigableMap(new TreeMap<K, V>()); 32583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * // Needn't be in synchronized block 32603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableSet<K> set = map.navigableKeySet(); 32613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * synchronized (map) { // Synchronizing on map, not set! 32633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Iterator<K> it = set.iterator(); // Must be in synchronized block 32643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * while (it.hasNext()) { 32653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * foo(it.next()); 32663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * } 32673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * }}</pre> 32683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>or: <pre> {@code 32703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableMap<K, V> map = synchronizedNavigableMap(new TreeMap<K, V>()); 32723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableMap<K, V> map2 = map.subMap(foo, false, bar, true); 32733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * // Needn't be in synchronized block 32753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * NavigableSet<K> set2 = map2.descendingKeySet(); 32763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * synchronized (map) { // Synchronizing on map, not map2 or set2! 32783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * Iterator<K> it = set2.iterator(); // Must be in synchronized block 32793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * while (it.hasNext()) { 32803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * foo(it.next()); 32813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * } 32823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * }}</pre> 32833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>Failure to follow this advice may result in non-deterministic behavior. 32853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * <p>The returned navigable map will be serializable if the specified 32873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * navigable map is serializable. 32883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * 32893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @param navigableMap the navigable map to be "wrapped" in a synchronized 32903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * navigable map. 32913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @return a synchronized view of the specified navigable map. 32923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin * @since 13.0 32933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin */ 32943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 32953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public static <K, V> NavigableMap<K, V> synchronizedNavigableMap( 32963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> navigableMap) { 32973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Synchronized.navigableMap(navigableMap); 32983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 32993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 33001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 33011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code AbstractMap} extension that implements {@link #isEmpty()} as {@code 33021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * entrySet().isEmpty()} instead of {@code size() == 0} to speed up 33031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementations where {@code size()} is O(n), and it delegates the {@code 33041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * isEmpty()} methods of its key set and value collection to this 33051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation. 33061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 33071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible 33087dd252788645e940eada959bdde927426e2531c9Paul Duffin abstract static class ImprovedAbstractMap<K, V> extends AbstractMap<K, V> { 33091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 33101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates the entry set to be returned by {@link #entrySet()}. This method 33111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * is invoked at most once on a given map, at the time when {@code entrySet} 33121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * is first called. 33131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 33140888a09821a98ac0680fad765217302858e70fa4Paul Duffin abstract Set<Entry<K, V>> createEntrySet(); 33151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33160888a09821a98ac0680fad765217302858e70fa4Paul Duffin private transient Set<Entry<K, V>> entrySet; 33171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33180888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Set<Entry<K, V>> entrySet() { 33191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> result = entrySet; 33200888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (result == null) ? entrySet = createEntrySet() : result; 33211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 33221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33230888a09821a98ac0680fad765217302858e70fa4Paul Duffin private transient Set<K> keySet; 33241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33250888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Set<K> keySet() { 33261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> result = keySet; 33270888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (result == null) ? keySet = createKeySet() : result; 33280888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 33290888a09821a98ac0680fad765217302858e70fa4Paul Duffin 33300888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<K> createKeySet() { 33310888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new KeySet<K, V>(this); 33321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 33331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33340888a09821a98ac0680fad765217302858e70fa4Paul Duffin private transient Collection<V> values; 33351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33360888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Collection<V> values() { 33371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> result = values; 33380888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (result == null) ? values = createValues() : result; 33391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 33401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33410888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<V> createValues() { 33420888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new Values<K, V>(this); 33430888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 33440888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 33451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 33471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Delegates to {@link Map#get}. Returns {@code null} on {@code 33487dd252788645e940eada959bdde927426e2531c9Paul Duffin * ClassCastException} and {@code NullPointerException}. 33491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 33500888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <V> V safeGet(Map<?, V> map, @Nullable Object key) { 33517dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(map); 33521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 33531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map.get(key); 33541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ClassCastException e) { 33551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return null; 33567dd252788645e940eada959bdde927426e2531c9Paul Duffin } catch (NullPointerException e) { 33577dd252788645e940eada959bdde927426e2531c9Paul Duffin return null; 33581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 33591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 33601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 33621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Delegates to {@link Map#containsKey}. Returns {@code false} on {@code 33637dd252788645e940eada959bdde927426e2531c9Paul Duffin * ClassCastException} and {@code NullPointerException}. 33641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 33651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static boolean safeContainsKey(Map<?, ?> map, Object key) { 33667dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(map); 33671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 33681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map.containsKey(key); 33691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ClassCastException e) { 33701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 33717dd252788645e940eada959bdde927426e2531c9Paul Duffin } catch (NullPointerException e) { 33727dd252788645e940eada959bdde927426e2531c9Paul Duffin return false; 33737dd252788645e940eada959bdde927426e2531c9Paul Duffin } 33747dd252788645e940eada959bdde927426e2531c9Paul Duffin } 33757dd252788645e940eada959bdde927426e2531c9Paul Duffin 33767dd252788645e940eada959bdde927426e2531c9Paul Duffin /** 33777dd252788645e940eada959bdde927426e2531c9Paul Duffin * Delegates to {@link Map#remove}. Returns {@code null} on {@code 33787dd252788645e940eada959bdde927426e2531c9Paul Duffin * ClassCastException} and {@code NullPointerException}. 33797dd252788645e940eada959bdde927426e2531c9Paul Duffin */ 33807dd252788645e940eada959bdde927426e2531c9Paul Duffin static <V> V safeRemove(Map<?, V> map, Object key) { 33817dd252788645e940eada959bdde927426e2531c9Paul Duffin checkNotNull(map); 33827dd252788645e940eada959bdde927426e2531c9Paul Duffin try { 33837dd252788645e940eada959bdde927426e2531c9Paul Duffin return map.remove(key); 33847dd252788645e940eada959bdde927426e2531c9Paul Duffin } catch (ClassCastException e) { 33857dd252788645e940eada959bdde927426e2531c9Paul Duffin return null; 33867dd252788645e940eada959bdde927426e2531c9Paul Duffin } catch (NullPointerException e) { 33877dd252788645e940eada959bdde927426e2531c9Paul Duffin return null; 33881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 33891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 33901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 33911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 33920888a09821a98ac0680fad765217302858e70fa4Paul Duffin * An admittedly inefficient implementation of {@link Map#containsKey}. 33930888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 33940888a09821a98ac0680fad765217302858e70fa4Paul Duffin static boolean containsKeyImpl(Map<?, ?> map, @Nullable Object key) { 33950888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Iterators.contains(keyIterator(map.entrySet().iterator()), key); 33960888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 33970888a09821a98ac0680fad765217302858e70fa4Paul Duffin 33980888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 33990888a09821a98ac0680fad765217302858e70fa4Paul Duffin * An implementation of {@link Map#containsValue}. 34000888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 34010888a09821a98ac0680fad765217302858e70fa4Paul Duffin static boolean containsValueImpl(Map<?, ?> map, @Nullable Object value) { 34020888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Iterators.contains(valueIterator(map.entrySet().iterator()), value); 34030888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 34040888a09821a98ac0680fad765217302858e70fa4Paul Duffin 34050888a09821a98ac0680fad765217302858e70fa4Paul Duffin /** 34061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Implements {@code Collection.contains} safely for forwarding collections of 34071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * map entries. If {@code o} is an instance of {@code Map.Entry}, it is 34081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * wrapped using {@link #unmodifiableEntry} to protect against a possible 34091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * nefarious equals method. 34101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 34111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Note that {@code c} is the backing (delegate) collection, rather than 34121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the forwarding collection. 34131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 34141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param c the delegate (unwrapped) collection of map entries 34151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param o the object that might be contained in {@code c} 34161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return {@code true} if {@code c} contains {@code o} 34171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 34181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <K, V> boolean containsEntryImpl(Collection<Entry<K, V>> c, Object o) { 34191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!(o instanceof Entry)) { 34201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 34211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return c.contains(unmodifiableEntry((Entry<?, ?>) o)); 34231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 34261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Implements {@code Collection.remove} safely for forwarding collections of 34271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * map entries. If {@code o} is an instance of {@code Map.Entry}, it is 34281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * wrapped using {@link #unmodifiableEntry} to protect against a possible 34291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * nefarious equals method. 34301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 34311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Note that {@code c} is backing (delegate) collection, rather than the 34321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * forwarding collection. 34331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 34341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param c the delegate (unwrapped) collection of map entries 34351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param o the object to remove from {@code c} 34361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return {@code true} if {@code c} was changed 34371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 34381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <K, V> boolean removeEntryImpl(Collection<Entry<K, V>> c, Object o) { 34391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!(o instanceof Entry)) { 34401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 34411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return c.remove(unmodifiableEntry((Entry<?, ?>) o)); 34431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 34461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link Map#equals}. 34471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 34481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static boolean equalsImpl(Map<?, ?> map, Object object) { 34491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (map == object) { 34501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 34510888a09821a98ac0680fad765217302858e70fa4Paul Duffin } else if (object instanceof Map) { 34521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<?, ?> o = (Map<?, ?>) object; 34531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map.entrySet().equals(o.entrySet()); 34541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 34561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34580888a09821a98ac0680fad765217302858e70fa4Paul Duffin static final MapJoiner STANDARD_JOINER = 34590888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collections2.STANDARD_JOINER.withKeyValueSeparator("="); 34600888a09821a98ac0680fad765217302858e70fa4Paul Duffin 34611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 34621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link Map#toString}. 34631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 34641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static String toStringImpl(Map<?, ?> map) { 34650888a09821a98ac0680fad765217302858e70fa4Paul Duffin StringBuilder sb 34660888a09821a98ac0680fad765217302858e70fa4Paul Duffin = Collections2.newStringBuilderForCollection(map.size()).append('{'); 34671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert STANDARD_JOINER.appendTo(sb, map); 34681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return sb.append('}').toString(); 34691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 34721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An implementation of {@link Map#putAll}. 34731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 34740888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> void putAllImpl( 34750888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> self, Map<? extends K, ? extends V> map) { 34761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) { 34771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert self.put(entry.getKey(), entry.getValue()); 34781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34810888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class KeySet<K, V> extends Sets.ImprovedAbstractSet<K> { 34820888a09821a98ac0680fad765217302858e70fa4Paul Duffin final Map<K, V> map; 34831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34840888a09821a98ac0680fad765217302858e70fa4Paul Duffin KeySet(Map<K, V> map) { 34850888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.map = checkNotNull(map); 34860888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 34871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34880888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map<K, V> map() { 34890888a09821a98ac0680fad765217302858e70fa4Paul Duffin return map; 34900888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 34911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34920888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Iterator<K> iterator() { 34937dd252788645e940eada959bdde927426e2531c9Paul Duffin return keyIterator(map().entrySet().iterator()); 34941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 34960888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int size() { 34971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().size(); 34981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 34991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 35000888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean isEmpty() { 35011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().isEmpty(); 35021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 35031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 35040888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean contains(Object o) { 35051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().containsKey(o); 35061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 35071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 35080888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean remove(Object o) { 35091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (contains(o)) { 35101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map().remove(o); 35111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 35121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 35131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 35141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 35151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 35160888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public void clear() { 3517dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin map().clear(); 35181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 35191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 35201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 35217dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 35227dd252788645e940eada959bdde927426e2531c9Paul Duffin static <K> K keyOrNull(@Nullable Entry<K, ?> entry) { 35237dd252788645e940eada959bdde927426e2531c9Paul Duffin return (entry == null) ? null : entry.getKey(); 35247dd252788645e940eada959bdde927426e2531c9Paul Duffin } 35257dd252788645e940eada959bdde927426e2531c9Paul Duffin 35267dd252788645e940eada959bdde927426e2531c9Paul Duffin @Nullable 35277dd252788645e940eada959bdde927426e2531c9Paul Duffin static <V> V valueOrNull(@Nullable Entry<?, V> entry) { 35287dd252788645e940eada959bdde927426e2531c9Paul Duffin return (entry == null) ? null : entry.getValue(); 35297dd252788645e940eada959bdde927426e2531c9Paul Duffin } 35307dd252788645e940eada959bdde927426e2531c9Paul Duffin 35310888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class SortedKeySet<K, V> extends KeySet<K, V> implements SortedSet<K> { 35320888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedKeySet(SortedMap<K, V> map) { 35330888a09821a98ac0680fad765217302858e70fa4Paul Duffin super(map); 35340888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 35357dd252788645e940eada959bdde927426e2531c9Paul Duffin 35360888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 35370888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> map() { 35380888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (SortedMap<K, V>) super.map(); 35390888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 35407dd252788645e940eada959bdde927426e2531c9Paul Duffin 35410888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 35420888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Comparator<? super K> comparator() { 35430888a09821a98ac0680fad765217302858e70fa4Paul Duffin return map().comparator(); 35440888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 35457dd252788645e940eada959bdde927426e2531c9Paul Duffin 35460888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 35470888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedSet<K> subSet(K fromElement, K toElement) { 35480888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SortedKeySet<K, V>(map().subMap(fromElement, toElement)); 35490888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 35507dd252788645e940eada959bdde927426e2531c9Paul Duffin 35510888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 35520888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedSet<K> headSet(K toElement) { 35530888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SortedKeySet<K, V>(map().headMap(toElement)); 35540888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 35557dd252788645e940eada959bdde927426e2531c9Paul Duffin 35560888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 35570888a09821a98ac0680fad765217302858e70fa4Paul Duffin public SortedSet<K> tailSet(K fromElement) { 35580888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SortedKeySet<K, V>(map().tailMap(fromElement)); 35590888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 35601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 35617dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 35620888a09821a98ac0680fad765217302858e70fa4Paul Duffin public K first() { 35630888a09821a98ac0680fad765217302858e70fa4Paul Duffin return map().firstKey(); 35641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 35651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 35667dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override 35670888a09821a98ac0680fad765217302858e70fa4Paul Duffin public K last() { 35680888a09821a98ac0680fad765217302858e70fa4Paul Duffin return map().lastKey(); 35690888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 35700888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 35710888a09821a98ac0680fad765217302858e70fa4Paul Duffin 35723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 35733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin static class NavigableKeySet<K, V> extends SortedKeySet<K, V> implements NavigableSet<K> { 35743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableKeySet(NavigableMap<K, V> map) { 35753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin super(map); 35763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 35773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 35783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 35793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> map() { 35803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return (NavigableMap<K, V>) map; 35813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 35823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 35833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 35843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K lower(K e) { 35853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map().lowerKey(e); 35863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 35873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 35883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 35893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K floor(K e) { 35903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map().floorKey(e); 35913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 35923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 35933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 35943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K ceiling(K e) { 35953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map().ceilingKey(e); 35963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 35973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 35983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 35993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K higher(K e) { 36003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map().higherKey(e); 36013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K pollFirst() { 36053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return keyOrNull(map().pollFirstEntry()); 36063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K pollLast() { 36103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return keyOrNull(map().pollLastEntry()); 36113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> descendingSet() { 36153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map().descendingKeySet(); 36163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Iterator<K> descendingIterator() { 36203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return descendingSet().iterator(); 36213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> subSet( 36253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin K fromElement, 36263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin boolean fromInclusive, 36273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin K toElement, 36283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin boolean toInclusive) { 36293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map().subMap(fromElement, fromInclusive, toElement, toInclusive).navigableKeySet(); 36303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> headSet(K toElement, boolean inclusive) { 36343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map().headMap(toElement, inclusive).navigableKeySet(); 36353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> tailSet(K fromElement, boolean inclusive) { 36393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return map().tailMap(fromElement, inclusive).navigableKeySet(); 36403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedSet<K> subSet(K fromElement, K toElement) { 36443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return subSet(fromElement, true, toElement, false); 36453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedSet<K> headSet(K toElement) { 36493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return headSet(toElement, false); 36503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 36533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedSet<K> tailSet(K fromElement) { 36543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return tailSet(fromElement, true); 36553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 36573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 36580888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class Values<K, V> extends AbstractCollection<V> { 36590888a09821a98ac0680fad765217302858e70fa4Paul Duffin final Map<K, V> map; 36600888a09821a98ac0680fad765217302858e70fa4Paul Duffin 36610888a09821a98ac0680fad765217302858e70fa4Paul Duffin Values(Map<K, V> map) { 36620888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.map = checkNotNull(map); 36630888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 36640888a09821a98ac0680fad765217302858e70fa4Paul Duffin 36650888a09821a98ac0680fad765217302858e70fa4Paul Duffin final Map<K, V> map() { 36660888a09821a98ac0680fad765217302858e70fa4Paul Duffin return map; 36670888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 36680888a09821a98ac0680fad765217302858e70fa4Paul Duffin 36690888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Iterator<V> iterator() { 36700888a09821a98ac0680fad765217302858e70fa4Paul Duffin return valueIterator(map().entrySet().iterator()); 36710888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 36720888a09821a98ac0680fad765217302858e70fa4Paul Duffin 36730888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean remove(Object o) { 36741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 36751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return super.remove(o); 36761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 36771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : map().entrySet()) { 36781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (Objects.equal(o, entry.getValue())) { 36791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map().remove(entry.getKey()); 36801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 36811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 36821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 36831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 36841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 36851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 36861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 36870888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean removeAll(Collection<?> c) { 36881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 36891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return super.removeAll(checkNotNull(c)); 36901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 36911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> toRemove = Sets.newHashSet(); 36921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : map().entrySet()) { 36931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (c.contains(entry.getValue())) { 36941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert toRemove.add(entry.getKey()); 36951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 36961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 36971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().keySet().removeAll(toRemove); 36981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 36991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37010888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean retainAll(Collection<?> c) { 37021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 37031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return super.retainAll(checkNotNull(c)); 37041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 37051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> toRetain = Sets.newHashSet(); 37061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : map().entrySet()) { 37071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (c.contains(entry.getValue())) { 37081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert toRetain.add(entry.getKey()); 37091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().keySet().retainAll(toRetain); 37121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37150888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int size() { 37161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().size(); 37171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37190888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean isEmpty() { 37201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().isEmpty(); 37211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37230888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean contains(@Nullable Object o) { 37241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().containsValue(o); 37251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37270888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public void clear() { 37281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map().clear(); 37291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37320888a09821a98ac0680fad765217302858e70fa4Paul Duffin abstract static class EntrySet<K, V> 37330888a09821a98ac0680fad765217302858e70fa4Paul Duffin extends Sets.ImprovedAbstractSet<Entry<K, V>> { 37341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert abstract Map<K, V> map(); 37351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37360888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int size() { 37371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().size(); 37381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37400888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public void clear() { 37411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map().clear(); 37421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37440888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean contains(Object o) { 37451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (o instanceof Entry) { 37461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<?, ?> entry = (Entry<?, ?>) o; 37471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object key = entry.getKey(); 37480888a09821a98ac0680fad765217302858e70fa4Paul Duffin V value = Maps.safeGet(map(), key); 37490888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Objects.equal(value, entry.getValue()) 37500888a09821a98ac0680fad765217302858e70fa4Paul Duffin && (value != null || map().containsKey(key)); 37511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 37531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37550888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean isEmpty() { 37561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().isEmpty(); 37571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37590888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean remove(Object o) { 37601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (contains(o)) { 37611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<?, ?> entry = (Entry<?, ?>) o; 37621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().keySet().remove(entry.getKey()); 37631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 37651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean removeAll(Collection<?> c) { 37681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 37691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return super.removeAll(checkNotNull(c)); 37701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 37711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // if the iterators don't support remove 37720888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Sets.removeAllImpl(this, c.iterator()); 37731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 37760888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean retainAll(Collection<?> c) { 37771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 37781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return super.retainAll(checkNotNull(c)); 37791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 37801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // if the iterators don't support remove 37811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Object> keys = Sets.newHashSetWithExpectedSize(c.size()); 37821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Object o : c) { 37831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (contains(o)) { 37841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<?, ?> entry = (Entry<?, ?>) o; 37851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keys.add(entry.getKey()); 37861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return map().keySet().retainAll(keys); 37891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 37923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 37933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @GwtIncompatible("NavigableMap") 37943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin abstract static class DescendingMap<K, V> extends ForwardingMap<K, V> 37953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin implements NavigableMap<K, V> { 37963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 37973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin abstract NavigableMap<K, V> forward(); 37983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 37993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin protected final Map<K, V> delegate() { 38013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward(); 38023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private transient Comparator<? super K> comparator; 38053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @SuppressWarnings("unchecked") 38073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Comparator<? super K> comparator() { 38093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Comparator<? super K> result = comparator; 38103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin if (result == null) { 38113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Comparator<? super K> forwardCmp = forward().comparator(); 38123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin if (forwardCmp == null) { 38133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin forwardCmp = (Comparator) Ordering.natural(); 38143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin result = comparator = reverse(forwardCmp); 38163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return result; 38183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin // If we inline this, we get a javac error. 38213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private static <T> Ordering<T> reverse(Comparator<T> forward) { 38223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return Ordering.from(forward).reverse(); 38233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K firstKey() { 38273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().lastKey(); 38283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K lastKey() { 38323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().firstKey(); 38333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> lowerEntry(K key) { 38373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().higherEntry(key); 38383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K lowerKey(K key) { 38423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().higherKey(key); 38433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> floorEntry(K key) { 38473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().ceilingEntry(key); 38483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K floorKey(K key) { 38523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().ceilingKey(key); 38533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> ceilingEntry(K key) { 38573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().floorEntry(key); 38583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K ceilingKey(K key) { 38623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().floorKey(key); 38633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> higherEntry(K key) { 38673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().lowerEntry(key); 38683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public K higherKey(K key) { 38723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().lowerKey(key); 38733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> firstEntry() { 38773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().lastEntry(); 38783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> lastEntry() { 38823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().firstEntry(); 38833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38843ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38853ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38863ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> pollFirstEntry() { 38873ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().pollLastEntry(); 38883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Entry<K, V> pollLastEntry() { 38923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().pollFirstEntry(); 38933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38943ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 38953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 38963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> descendingMap() { 38973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward(); 38983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 38993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private transient Set<Entry<K, V>> entrySet; 39013ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39033ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Set<Entry<K, V>> entrySet() { 39043ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Set<Entry<K, V>> result = entrySet; 39053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return (result == null) ? entrySet = createEntrySet() : result; 39063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin abstract Iterator<Entry<K, V>> entryIterator(); 39093ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Set<Entry<K, V>> createEntrySet() { 39113ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new EntrySet<K, V>() { 39123ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin Map<K, V> map() { 39143ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return DescendingMap.this; 39153ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39173ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39183ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Iterator<Entry<K, V>> iterator() { 39193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return entryIterator(); 39203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39213ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin }; 39223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Set<K> keySet() { 39263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return navigableKeySet(); 39273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39283ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin private transient NavigableSet<K> navigableKeySet; 39303ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> navigableKeySet() { 39333ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableSet<K> result = navigableKeySet; 39343ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return (result == null) ? navigableKeySet = new NavigableKeySet<K, V>(this) : result; 39353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39363ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39383ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableSet<K> descendingKeySet() { 39393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().navigableKeySet(); 39403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39413ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39423ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39433ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public 39443ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin NavigableMap<K, V> 39453ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { 39463ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().subMap(toKey, toInclusive, fromKey, fromInclusive).descendingMap(); 39473ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39503ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> headMap(K toKey, boolean inclusive) { 39513ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().tailMap(toKey, inclusive).descendingMap(); 39523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) { 39563ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return forward().headMap(fromKey, inclusive).descendingMap(); 39573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedMap<K, V> subMap(K fromKey, K toKey) { 39613ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return subMap(fromKey, true, toKey, false); 39623ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39643ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39653ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedMap<K, V> headMap(K toKey) { 39663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return headMap(toKey, false); 39673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39703ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public SortedMap<K, V> tailMap(K fromKey) { 39713ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return tailMap(fromKey, true); 39723ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39733ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39743ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39753ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public Collection<V> values() { 39763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return new Values<K, V>(this); 39773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin 39793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin @Override 39803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin public String toString() { 39813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin return standardToString(); 39823ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39833ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin } 39841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 3985