检查不可变映射构建器中的值(列表)是否存在

时间:2016-07-29 17:44:21

标签: java guava

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

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);
}

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

有没有办法让这个地图不可变,而不使用不必要的代码,比如更多的循环来首先初始化目标键的列表?

顺便说一下。我使用的是Java 7

1 个答案:

答案 0 :(得分:7)

您应该在这里使用ListMultimap。使用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);