Java example source code file (MultimapBuilder.java)
This example Java source code file (MultimapBuilder.java) is included in the alvinalexander.com
"Java Source Code
Warehouse" project. The intent of this project is to help you "Learn
Java by Example" TM.
/*
* Copyright (C) 2013 The Guava Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.collect;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.CollectPreconditions.checkNonnegative;
import static com.google.common.collect.Maps.newLinkedHashMapWithExpectedSize;
import com.google.common.annotations.Beta;
import com.google.common.annotations.GwtCompatible;
import com.google.common.base.Supplier;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
/**
* A builder for a multimap implementation that allows customization of the backing map and value
* collection implementations used in a particular multimap.
*
* <p>This can be used to easily configure multimap data structure implementations not provided
* explicitly in {@code com.google.common.collect}, for example:
*
* <pre> {@code
* ListMultimap<String, Integer> treeListMultimap =
* MultimapBuilder.treeKeys().arrayListValues().build();
* SetMultimap<Integer, MyEnum> hashEnumMultimap =
* MultimapBuilder.hashKeys().enumSetValues(MyEnum.class).build();}</pre>
*
* <p>{@code MultimapBuilder} instances are immutable. Invoking a configuration method has no
* effect on the receiving instance; you must store and use the new builder instance it returns
* instead.
*
* <p>The generated multimaps are serializable if the key and value types are serializable,
* unless stated otherwise in one of the configuration methods.
*
* @author Louis Wasserman
* @param <K0> An upper bound on the key type of the generated multimap.
* @param <V0> An upper bound on the value type of the generated multimap.
* @since 16.0
*/
@Beta
@GwtCompatible
public abstract class MultimapBuilder<K0, V0> {
/*
* Leaving K and V as upper bounds rather than the actual key and value types allows type
* parameters to be left implicit more often. CacheBuilder uses the same technique.
*/
private MultimapBuilder() {}
private static final int DEFAULT_EXPECTED_KEYS = 8;
/**
* Uses a {@link HashMap} to map keys to value collections.
*/
public static MultimapBuilderWithKeys<Object> hashKeys() {
return hashKeys(DEFAULT_EXPECTED_KEYS);
}
/**
* Uses a {@link HashMap} to map keys to value collections, initialized to expect the specified
* number of keys.
*
* @throws IllegalArgumentException if {@code expectedKeys < 0}
*/
public static MultimapBuilderWithKeys<Object> hashKeys(final int expectedKeys) {
checkNonnegative(expectedKeys, "expectedKeys");
return new MultimapBuilderWithKeys<Object>() {
@Override
<K, V> Map> createMap() {
return Maps.newHashMapWithExpectedSize(expectedKeys);
}
};
}
/**
* Uses a {@link LinkedHashMap} to map keys to value collections.
*
* <p>The collections returned by {@link Multimap#keySet()}, {@link Multimap#keys()}, and
* {@link Multimap#asMap()} will iterate through the keys in the order that they were first added
* to the multimap, save that if all values associated with a key are removed and then the key is
* added back into the multimap, that key will come last in the key iteration order.
*/
public static MultimapBuilderWithKeys<Object> linkedHashKeys() {
return linkedHashKeys(DEFAULT_EXPECTED_KEYS);
}
/**
* Uses a {@link LinkedHashMap} to map keys to value collections, initialized to expect the
* specified number of keys.
*
* <p>The collections returned by {@link Multimap#keySet()}, {@link Multimap#keys()}, and
* {@link Multimap#asMap()} will iterate through the keys in the order that they were first added
* to the multimap, save that if all values associated with a key are removed and then the key is
* added back into the multimap, that key will come last in the key iteration order.
*/
public static MultimapBuilderWithKeys<Object> linkedHashKeys(final int expectedKeys) {
checkNonnegative(expectedKeys, "expectedKeys");
return new MultimapBuilderWithKeys<Object>() {
@Override
<K, V> Map> createMap() {
return newLinkedHashMapWithExpectedSize(expectedKeys);
}
};
}
/**
* Uses a naturally-ordered {@link TreeMap} to map keys to value collections.
*
* <p>The collections returned by {@link Multimap#keySet()}, {@link Multimap#keys()}, and
* {@link Multimap#asMap()} will iterate through the keys in sorted order.
*
* <p>For all multimaps generated by the resulting builder, the {@link Multimap#keySet()} can be
* safely cast to a {@link java.util.SortedSet}, and the {@link Multimap#asMap()} can safely be
* cast to a {@link java.util.SortedMap}.
*/
@SuppressWarnings("rawtypes")
public static MultimapBuilderWithKeys<Comparable> treeKeys() {
return treeKeys(Ordering.natural());
}
/**
* Uses a {@link TreeMap} sorted by the specified comparator to map keys to value collections.
*
* <p>The collections returned by {@link Multimap#keySet()}, {@link Multimap#keys()}, and
* {@link Multimap#asMap()} will iterate through the keys in sorted order.
*
* <p>For all multimaps generated by the resulting builder, the {@link Multimap#keySet()} can be
* safely cast to a {@link java.util.SortedSet}, and the {@link Multimap#asMap()} can safely be
* cast to a {@link java.util.SortedMap}.
*
* <p>Multimaps generated by the resulting builder will not be serializable if {@code comparator}
* is not serializable.
*/
public static <K0> MultimapBuilderWithKeys treeKeys(final Comparator comparator) {
checkNotNull(comparator);
return new MultimapBuilderWithKeys<K0>() {
@Override
<K extends K0, V> Map> createMap() {
return new TreeMap<K, Collection(comparator);
}
};
}
/**
* Uses an {@link EnumMap} to map keys to value collections.
*/
public static <K0 extends Enum MultimapBuilderWithKeys enumKeys(
final Class<K0> keyClass) {
checkNotNull(keyClass);
return new MultimapBuilderWithKeys<K0>() {
@SuppressWarnings("unchecked")
@Override
<K extends K0, V> Map> createMap() {
// K must actually be K0, since enums are effectively final
// (their subclasses are inaccessible)
return (Map<K, Collection) new EnumMap>(keyClass);
}
};
}
private static final class ArrayListSupplier<V> implements Supplier>, Serializable {
private final int expectedValuesPerKey;
ArrayListSupplier(int expectedValuesPerKey) {
this.expectedValuesPerKey = checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
}
@Override
public List<V> get() {
return new ArrayList<V>(expectedValuesPerKey);
}
}
private enum LinkedListSupplier implements Supplier<List
Other Java examples (source code examples)
Here is a short list of links related to this Java MultimapBuilder.java source code file: