如果我想创建一个简单默认值的新Multimap,我需要做类似的事情:
private final Multimap<Key, Value> providersToClasses = Multimaps
.newListMultimap(
new HashMap<Key, Collection<Value>>(),
new Supplier<List<Value>>() {
@Override
public List<Value> get() {
return Lists.newArrayList();
}
});
因为如果Maps.newHashMap
用于支持地图,Java无法推断出正确的类型。当然,这可以重构为一个单独的方法,但是有没有办法更简洁地写它?
答案 0 :(得分:54)
为什么不将ArrayListMultimap.create()
用于这样一个简单的案例?这是创建简单HashMap / ArrayList的默认方式,可能是最常用的多图。
答案 1 :(得分:14)
在编写客户端和构建查询参数的映射时,我遇到了这个问题。我喜欢用于构建多地图的简洁模式是使用ImmutableMultiMap#builder
Multimap<String, String> queryParams =
ImmutableMultimap.<String, String>builder()
.put("key-1", "value-1")
.put("key-1", "value-2")
.build();
答案 2 :(得分:9)
Guava documentation指出,其他一些答案提倡的create
方法&#34;很快就会被弃用&#34; ,支持下面列出的不同表格,因此应该避免。
从 Guava 21.0开始,创建Multimap
对象的建议方法是将值存储在ArrayList
个集合中,如下所示:
MultimapBuilder.hashKeys().arrayListValues().build();
如果要指定地图中预期的键数以及每个键的预期值数,也可以使用参数:
MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build();
最后,您可以使用此构造从现有的Multimap
创建新的MultimapBuilder.hashKeys().arrayListValues().build(multimap);
:
ArrayLists
如果您想在Multimap
中使用arrayListValues()
以外的数据结构,则可以将0, 1, 2, 3, etc.
的号码替换为here列出的其他号码$array = array(
array("FIRST_NAME" => "Jon", "LAST_NAME" => "Doe"),
array("FIRST_NAME" => "Jane", "LAST_NAME" => "Doe"),
array("FIRST_NAME" => "Johnny", "LAST_NAME" => "Doe"),
array("FIRST_NAME" => "Janie", "LAST_NAME" => "Doe"));
$output = "";
foreach ($array as $i => $values) { // get the inner arrays from the outer array
if ($i != 0) { // check if it is not the first array
$output .= ", {$values['FIRST_NAME']} {$values['LAST_NAME']}";
} else {
$output .= "{$values['FIRST_NAME']} {$values['LAST_NAME']}";
}
}
echo $output;
// Jon Doe, Jane Doe, Johnny Doe, Janie Doe
。
答案 3 :(得分:4)
在Java 8中,对于所有类型的多图,这都好得多。这有两个原因:
HashMap
构造函数提供显式类型参数。ArrayList
工厂。看起来像这样:
Multimap<Key, Value> providersToClasses =
Multimaps.newListMultimap(new HashMap<>(), ArrayList::new);
答案 4 :(得分:4)
这是紧凑的解决方案:
Multimap<Integer, String> multi = HashMultimap.create();
答案 5 :(得分:2)
要回答原始类型推断问题,您还可以使用Maps.<Key, Collection<Value>>newHashMap()
在静态方法上指定泛型类型,但它肯定不会比new HashMap<Key, Collection<Value>>()
更简洁(它可能更一致)