我有一个像这样定义的地图:
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
答案 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);