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

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


我什至在Commons Collections中也找不到类似的东西。

我是否错过了JDK或Commons中的某些方式?

最佳答案

番石榴具有其ImmutableMap

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


奖励:ImmutableMap的名字不是谎言;)

请注意,.of()方法有5个版本,因此最多有5个键/值对。一种更通用的方法是使用构建器:

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


但是请注意:此映射不接受空键或值。

或者,这是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();

10-08 06:49