java:从一个表达式构造一个Map?

kzmpq1sx  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(299)

我想知道为什么没有办法用一个表达式中的值来构造一个Map。还是真的?我希望

new HashMap().add(key, value).add(key, value)...;

我甚至在公地收藏中也找不到这样的东西。
我在jdk或commons中错过了什么吗?

c8ib6hqw

c8ib6hqw1#

试试这个。。

Map<String, Integer> map = new HashMap<String, Integer>()
{{
     put("One", 1);
     put("Two", 2);
     put("Three", 3);
}};
c9x0cxw0

c9x0cxw02#

如果您的密钥和值是同一类型的,则使用以下方法:

<K> Map<K, K> init(Map<K, K> map, K... args) {
    K k = null;
    for(K arg : args) {
        if(k != null) {
            map.put(k, arg);
            k = null;
        } else {
            k = arg;
        }
    }
    return map;
}

您可以使用以下命令初始化Map:

init(new HashMap<String, String>(), "k1", "v1", "k2", "v2");

如果您的钥匙和阀门属于不同的类型,则使用以下方法:

<K, V> Map<K, V> init(Map<K, V> map, List<K> keys, List<V> values) {
    for(int i = 0; i < keys.size(); i++) {
        map.put(keys.get(i), values.get(i));
    }
    return map;
}

您可以使用以下命令初始化Map:

init(new HashMap<String, Integer>(), 
     Arrays.asList("k1", "k2"), 
     Arrays.asList(1, 2));
hjqgdpho

hjqgdpho3#

Guava和它的 ImmutableMap :

final Map<Foo, Bar> map = ImmutableMap.of(foo1, bar1, foo2, bar2, etc, etc);

奖金: ImmutableMap 的名字不是谎言;)
请注意,有5个版本的 .of() 方法,所以最多有5个键/值对。更通用的方法是使用生成器:

final Map<Foo, Bar> map = ImmutableMap.<Foo, Bar>builder()
    .put(foo1, bar1)
    .put(foo2, bar2)
    .put(foo3, bar3)
    .put(etc, etc)
    .build();

但是请注意:此Map不接受null键或值。
或者,这是一个穷人版本的 ImmutableMap . 它使用了一个经典的生成器模式。请注意,它不检查空值:

public final class MapBuilder<K, V>
{
    private final Map<K, V> map = new HashMap<K, V>();

    public MapBuilder<K, V> put(final K key, final V value)
    {
        map.put(key, value);
        return this;
    }

    public Map<K, V> build()
    {
        // Return a mutable copy, so that the builder can be reused
        return new HashMap<K, V>(map);
    }

    public Map<K, V> immutable()
    {
        // Return a copy wrapped into Collections.unmodifiableMap()
        return Collections.unmodifiableMap(build());
    }
}

然后您可以使用:

final Map<K, V> map = new MapBuilder<K, V>().put(...).put(...).immutable();
okxuctiv

okxuctiv4#

在commons集合或jdk中没有任何内容。但您也可以使用Guava和以下代码:

Map<String, String> mapInstance = ImmutableMap.<String, String> builder().put("key1", "value1").put("key2", "value2").build();

相关问题