Prefer Multimap subtypes and MultimapBuilder Guava team recommends using the subinterfaces of Multimap, for the same reasons they recommend using Set and List rather than Collection: it documents expectations about ordering, uniqueness, and behavior of equals. They also recommends MultimapBuilder over specific Multimap implementations, so callers don't have to know the specific key/value behaviors of the individual implementations. The static factory methods in the implementations will be removed in a later version. Change-Id: Iababa60c8d2946a390ccc8cd9c7327184e6f6258
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java b/gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java index 1cbc374..6f25f58 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java
@@ -14,10 +14,10 @@ package com.google.gitiles.doc; -import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Iterables; +import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; +import com.google.common.collect.MultimapBuilder; import com.google.gitiles.doc.html.HtmlBuilder; import java.util.ArrayDeque; import java.util.ArrayList; @@ -47,7 +47,8 @@ void setRoot(Node doc) { outline = new ArrayList<>(); - Multimap<String, TocEntry> entries = ArrayListMultimap.create(16, 4); + ListMultimap<String, TocEntry> entries = + MultimapBuilder.hashKeys(16).arrayListValues(4).build(); scan(doc, entries, new ArrayDeque<Heading>()); ids = generateIds(entries); } @@ -113,7 +114,7 @@ .close("li"); } - private void scan(Node node, Multimap<String, TocEntry> entries, Deque<Heading> stack) { + private void scan(Node node, ListMultimap<String, TocEntry> entries, Deque<Heading> stack) { if (node instanceof Heading) { scan((Heading) node, entries, stack); } else { @@ -123,7 +124,7 @@ } } - private void scan(Heading header, Multimap<String, TocEntry> entries, Deque<Heading> stack) { + private void scan(Heading header, ListMultimap<String, TocEntry> entries, Deque<Heading> stack) { if (header.getLevel() == 1) { countH1++; } @@ -161,8 +162,9 @@ return null; } - private Map<Heading, String> generateIds(Multimap<String, TocEntry> entries) { - Multimap<String, TocEntry> tmp = ArrayListMultimap.create(entries.size(), 2); + private Map<Heading, String> generateIds(ListMultimap<String, TocEntry> entries) { + ListMultimap<String, TocEntry> tmp = + MultimapBuilder.hashKeys(entries.size()).arrayListValues(2).build(); for (Collection<TocEntry> headers : entries.asMap().values()) { if (headers.size() == 1) { TocEntry entry = Iterables.getOnlyElement(headers);