Skip to content

Commit

Permalink
Lazily initialize the map in ImmutableMultimap.Builder.
Browse files Browse the repository at this point in the history
RELNOTES=n/a
PiperOrigin-RevId: 643452102
  • Loading branch information
lowasser authored and Google Java Core Libraries committed Jun 14, 2024
1 parent 808e079 commit 95b394c
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 10 deletions.
26 changes: 21 additions & 5 deletions android/guava/src/com/google/common/collect/ImmutableMultimap.java
Original file line number Diff line number Diff line change
Expand Up @@ -149,16 +149,23 @@ public static <K, V> Builder<K, V> builder() {
*/
@DoNotMock
public static class Builder<K, V> {
final Map<K, Collection<V>> builderMap;
@CheckForNull Map<K, Collection<V>> builderMap;
@CheckForNull Comparator<? super K> keyComparator;
@CheckForNull Comparator<? super V> valueComparator;

/**
* Creates a new builder. The returned builder is equivalent to the builder generated by {@link
* ImmutableMultimap#builder}.
*/
public Builder() {
this.builderMap = Platform.preservesInsertionOrderOnPutsMap();
public Builder() {}

Map<K, Collection<V>> ensureBuilderMapNonNull() {
Map<K, Collection<V>> result = builderMap;
if (result == null) {
result = Platform.preservesInsertionOrderOnPutsMap();
builderMap = result;
}
return result;
}

Collection<V> newMutableValueCollection() {
Expand All @@ -169,6 +176,7 @@ Collection<V> newMutableValueCollection() {
@CanIgnoreReturnValue
public Builder<K, V> put(K key, V value) {
checkEntryNotNull(key, value);
Map<K, Collection<V>> builderMap = ensureBuilderMapNonNull();
Collection<V> valueCollection = builderMap.get(key);
if (valueCollection == null) {
builderMap.put(key, valueCollection = newMutableValueCollection());
Expand Down Expand Up @@ -211,6 +219,7 @@ public Builder<K, V> putAll(K key, Iterable<? extends V> values) {
if (key == null) {
throw new NullPointerException("null key in entry: null=" + Iterables.toString(values));
}
Map<K, Collection<V>> builderMap = ensureBuilderMapNonNull();
Collection<V> valueCollection = builderMap.get(key);
if (valueCollection != null) {
for (V value : values) {
Expand Down Expand Up @@ -285,14 +294,21 @@ public Builder<K, V> orderValuesBy(Comparator<? super V> valueComparator) {

@CanIgnoreReturnValue
Builder<K, V> combine(Builder<K, V> other) {
for (Map.Entry<K, Collection<V>> entry : other.builderMap.entrySet()) {
putAll(entry.getKey(), entry.getValue());
Map<K, Collection<V>> otherBuilderMap = other.builderMap;
if (otherBuilderMap != null) {
for (Map.Entry<K, Collection<V>> entry : otherBuilderMap.entrySet()) {
putAll(entry.getKey(), entry.getValue());
}
}
return this;
}

/** Returns a newly-created immutable multimap. */
public ImmutableMultimap<K, V> build() {
Map<K, Collection<V>> builderMap = this.builderMap;
if (builderMap == null) {
return ImmutableListMultimap.of();
}
Collection<Map.Entry<K, Collection<V>>> mapEntries = builderMap.entrySet();
if (keyComparator != null) {
mapEntries = Ordering.from(keyComparator).<K>onKeys().immutableSortedCopy(mapEntries);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,10 @@ public Builder<K, V> orderValuesBy(Comparator<? super V> valueComparator) {
/** Returns a newly-created immutable set multimap. */
@Override
public ImmutableSetMultimap<K, V> build() {
Map<K, Collection<V>> builderMap = this.builderMap;
if (builderMap == null) {
return ImmutableSetMultimap.of();
}
Collection<Map.Entry<K, Collection<V>>> mapEntries = builderMap.entrySet();
if (keyComparator != null) {
mapEntries = Ordering.from(keyComparator).<K>onKeys().immutableSortedCopy(mapEntries);
Expand Down
26 changes: 21 additions & 5 deletions guava/src/com/google/common/collect/ImmutableMultimap.java
Original file line number Diff line number Diff line change
Expand Up @@ -151,16 +151,23 @@ public static <K, V> Builder<K, V> builder() {
*/
@DoNotMock
public static class Builder<K, V> {
final Map<K, Collection<V>> builderMap;
@CheckForNull Map<K, Collection<V>> builderMap;
@CheckForNull Comparator<? super K> keyComparator;
@CheckForNull Comparator<? super V> valueComparator;

/**
* Creates a new builder. The returned builder is equivalent to the builder generated by {@link
* ImmutableMultimap#builder}.
*/
public Builder() {
this.builderMap = Platform.preservesInsertionOrderOnPutsMap();
public Builder() {}

Map<K, Collection<V>> ensureBuilderMapNonNull() {
Map<K, Collection<V>> result = builderMap;
if (result == null) {
result = Platform.preservesInsertionOrderOnPutsMap();
builderMap = result;
}
return result;
}

Collection<V> newMutableValueCollection() {
Expand All @@ -171,6 +178,7 @@ Collection<V> newMutableValueCollection() {
@CanIgnoreReturnValue
public Builder<K, V> put(K key, V value) {
checkEntryNotNull(key, value);
Map<K, Collection<V>> builderMap = ensureBuilderMapNonNull();
Collection<V> valueCollection = builderMap.get(key);
if (valueCollection == null) {
builderMap.put(key, valueCollection = newMutableValueCollection());
Expand Down Expand Up @@ -213,6 +221,7 @@ public Builder<K, V> putAll(K key, Iterable<? extends V> values) {
if (key == null) {
throw new NullPointerException("null key in entry: null=" + Iterables.toString(values));
}
Map<K, Collection<V>> builderMap = ensureBuilderMapNonNull();
Collection<V> valueCollection = builderMap.get(key);
if (valueCollection != null) {
for (V value : values) {
Expand Down Expand Up @@ -287,14 +296,21 @@ public Builder<K, V> orderValuesBy(Comparator<? super V> valueComparator) {

@CanIgnoreReturnValue
Builder<K, V> combine(Builder<K, V> other) {
for (Map.Entry<K, Collection<V>> entry : other.builderMap.entrySet()) {
putAll(entry.getKey(), entry.getValue());
Map<K, Collection<V>> otherBuilderMap = other.builderMap;
if (otherBuilderMap != null) {
for (Map.Entry<K, Collection<V>> entry : otherBuilderMap.entrySet()) {
putAll(entry.getKey(), entry.getValue());
}
}
return this;
}

/** Returns a newly-created immutable multimap. */
public ImmutableMultimap<K, V> build() {
Map<K, Collection<V>> builderMap = this.builderMap;
if (builderMap == null) {
return ImmutableListMultimap.of();
}
Collection<Map.Entry<K, Collection<V>>> mapEntries = builderMap.entrySet();
if (keyComparator != null) {
mapEntries = Ordering.from(keyComparator).<K>onKeys().immutableSortedCopy(mapEntries);
Expand Down
4 changes: 4 additions & 0 deletions guava/src/com/google/common/collect/ImmutableSetMultimap.java
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,10 @@ public Builder<K, V> orderValuesBy(Comparator<? super V> valueComparator) {
/** Returns a newly-created immutable set multimap. */
@Override
public ImmutableSetMultimap<K, V> build() {
Map<K, Collection<V>> builderMap = this.builderMap;
if (builderMap == null) {
return ImmutableSetMultimap.of();
}
Collection<Map.Entry<K, Collection<V>>> mapEntries = builderMap.entrySet();
if (keyComparator != null) {
mapEntries = Ordering.from(keyComparator).<K>onKeys().immutableSortedCopy(mapEntries);
Expand Down

0 comments on commit 95b394c

Please sign in to comment.