Arrays.asList也适用于地图吗?

24

我有以下代码:

Map<String, Map<Double, String>> map = new HashMap<>();
Map<Double,String> Amap = new HashMap<>();
map.put(getValuesTypes.FUT(), HERE);

我不是首先创建一个Map并将其放置在"HERE",而是寻找像我可以与List一起使用的函数Arrays.asList(...),因此我可以只输入"Here" ?.asMap({1.0,"A"}, {2.0,"B"})


{1.0,"A"} 是一个对象数组,而不是一个映射。 - OneCricketeer
1
在Java 9中,您将能够使用集合工厂方法来创建不可变映射,请参见http://download.java.net/java/jdk9/docs/api/java/util/Map.html#of-K-V-及其变体。 - Tordanik
5个回答

24

您可以像这样初始化 HashMap

new HashMap<Double, String>() {
    {
        put(1.0, "ValA");
        put(2.0, "ValB");
    }
};

7
请注意,这种方式存在创建额外地图实例的隐藏成本。它被称为双括号初始化。 - jakubbialkowski
4
使用Java 9,您可以简单地执行以下操作:new HashMap<Double, String>(Map.of( 1.0, "A", 2.0, "B" )); - Mike D3ViD Tyson

10

使用Guava

Map<Double, String> map = ImmutableMap.of(1.0, "A", 2.0, "B");

6

Guava的ImmutableMap.of(..)可以帮助实现这一目标:

ImmutableMap.of(1, "a");

在JDK中只有Collections.singletonMap(..),但这只提供了一个键值对的映射。
guava项目中有一个讨论,想要包含Maps.asMap(Object... varArgs),但被终止了。因此,使用ImmutableMap.of(...)是正确的方法。 自JDK 9开始编辑 在JDK 9中添加了新的方法来完成相同的事情:Map.of(K,V)

1

没有直接初始化map的文字。但是你可以使用即时生成的匿名类:

map.put(getValuesTypes.FUT(), new HashMap<Double, String>() {{
    put(1.0, "A");
    put(2.0, "B");
}});

虽然不建议,但我建议使用Guava的 ImmutableMap
map.put(getValuesTypes.FUT(), ImmutableMap.<Double, String>of(1.0, "A", 2.0, "B"));

如果一对以上的数量大于5,您应该使用它们的builder
map.put(getValuesTypes.FUT(), 
        ImmutableMap.<Double, String>builder().put(1.0, "A")/* 5+ puts */.build());

无需导入额外的库,您可以像这样使用 java.util.CollectionsCollections.unmodifiableMap(myHashMapInstance) - Jaxon

0

你只能通过使用匿名类来初始化一个新的映射。例如:

new HashMap<K, V>() {{ put(key, value); put(key, value); }};


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接