从Java中的键值对构建映射

时间:2012-01-16 11:14:23

标签: java collections map guava

  

可能重复:
  builder for HashMap

是否有任何实用程序类允许以方便可读的方式从多个键值对创建Map?

我认为guava应该包含一些东西,但我找不到任何具有必要功能的东西。

我想要的是这样的:

MapBuilder.newHashMap()
  .with("key1", 10)
  .with("key2", 20)
  .with("key3", 30)
  .build();

P.S。我也知道双支撑法(new HashMap<>() {{ put(..); put(..); }}),但我发现它不易读或不方便。

4 个答案:

答案 0 :(得分:6)

有什么问题
Map<String, Integer> map = new HashMap<>();
map.put("key1", 10);
map.put("key2", 20);
map.put("key3", 30);

这看起来对我来说非常易读,而且我看不到你从MapBuilder中获得了什么。无论如何,这样的MapBuilder并不难实现。

答案 1 :(得分:5)

为什么不自己滚动?

public class MapBuilder<K,V> {

    private Map<K,V> map;

    public static <K,V> MapBuilder<K,V> newHashMap(){
            return new MapBuilder<K,V>(new HashMap<K,V>());
    }

    public MapBuilder(Map<K,V> map) {
        this.map = map;
    }

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

    public Map<K,V> build(){
        return map;
    }

}

答案 2 :(得分:2)

如何使用返回AbstractMap的put方法创建自己的this

public class MyMap<K, V> extends AbstractMap<K, V>{

    @Override
    public Set<java.util.Map.Entry<K, V>> entrySet() {
        // return set
        return null;
    }

    public MyMap<K, V> puts(K key, V value) {
        this.put(key, value);
        return this;
    };

}

然后使用该方法链对:

new MyMap<String, String>()
            .puts("foo", "bar")
            .puts("Hello", "World");

答案 3 :(得分:0)

从头开始,未经测试:

import java.util.HashMap;

public class MapBuilder<K, E> {
    private HashMap<K, E>       m_hashMap;

    public static HashMap newHashMap(Class<K> keyClass, Class<E> elementClass) {
        return new MapBuilder<K, E>();
    }

    public MapBuilder() {
        m_hashMap = new HashMap<K, E>();
    }

    public MapBuilder with(K key, E element) {
        m_hashMap.put(key, element);

        return this;
    }

    public HashMap<K, E> build() {
        return m_hashMap;
    }
}

用法:

HashMap<String, Integer> myMap = MapBuilder.newHashMap(String.class, Integer.class)
    .with("key1", 10)
    .with("key2", 20)
    .with("key3", 30)
    .build();