检查不可变地图构建器中是否存在值(列表)

Check for value (list) existence in immutable map builder

我有一个这样定义的地图:

Map<String, List<SomeClass>> map = new HashMap<>();

我认为通过使用 ImmutableMap.Builder 构造使其不可变会很好。 但就我而言,在将新元素放入地图时,我需要首先检查它们是否存在,如果给定键的列表不存在,则创建它并向其添加元素:

for(final SomeClass elem : elements){
    final String key = elem.getKey();
    if(!map.containsKey(target)){
        map.put(key, new LinkedList<SomeClass>());
    }
    map.get(key).add(elem);
}

如果地图中有目标键,我需要创建分配给它的新列表,然后将元素添加到该列表中。

有没有什么方法可以使该映射不可变,而无需使用不必要的代码(例如更多循环)来首先初始化目标键列表?

顺便说一句。我正在使用 Java 7

你应该使用 ListMultimap here. Using ImmutableListMultimap.builder():

ImmutableListMultimap.Builder<String, SomeClass> builder = ImmutableListMultimap.builder();
for (final SomeClass elem : elements) {
    final String key = elem.getKey();
    builder.put(key, elem);
}
ImmutableListMultimap<String, SomeClass> multimap = builder.build();

但是等等!您的用例有内置方法 - Multimaps#index(Iterable, Function):

ImmutableListMultimap<String, SomeClass> multimap = Multimaps.index(
    elements,
    new Function<SomeClass, String>() {
        @Override public String apply(final SomeClass element) {
            return element.getKey();
        }
    });

(在Java 8):

ImmutableListMultimap<String, SomeClass> multimap =
    Multimaps.index(elements, SomeClass::getKey);