【问题标题】:Building a map from key-values pairs in Java [duplicate]从 Java 中的键值对构建映射 [重复]
【发布时间】:2012-02-11 08:19:18
【问题描述】:

可能重复:
builder for HashMap

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

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

我想要的是这样的:

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

附:我也知道双括号方法 (new HashMap<>() {{ put(..); put(..); }}),但我觉得它既不可读也不方便。

【问题讨论】:

  • @Roman 关于双大括号方法 - 这是匿名类定义,您在初始化块(第二对大括号)中调用 put()。我不喜欢这种方法,因为它通常会生成有关缺少 serialVersionUID 的警告,并且您需要 @supressWarnings("serial")。
  • Guava's ImmutableMap.Builder。对于像这样的小地图,另请参阅更方便的ImmutableMap.of
  • 以上链接失效。新链接:ImmutableMap.builder()ImmutableMap.of()

标签: java collections map guava


【解决方案1】:

怎么了

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

这对我来说看起来很可读,我看不出你从 MapBuilder 中获得了什么。反正这样的 MapBuilder 实现起来也不难。

【讨论】:

  • 同意,非常易读。同意,易于实施。 (我希望我建议的实现没有错误哈哈)
【解决方案2】:

为什么不自己动手?

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;
    }

}

【讨论】:

  • 静态方法newHashMap()如何知道KV
  • 是在static之后的&lt;K, V&gt;,这意味着它将从赋值运算符的左侧获取吗?
  • 是泛型方法,也是泛型类
  • 我知道这是一种通用方法。我对类型的来源是否正确?
  • 调用方法时给出的类型:MapBuilder.newHashMap()。如果你声明一个 MapBuilder 变量,它可以从 builder 的类型中推断出来: MapBuilder b = MapBuilder.newHashMap();
【解决方案3】:

使用返回 this 的 put 方法创建自己的 AbstractMap 怎么样?

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");

【讨论】:

    【解决方案4】:

    从头开始,未经测试:

    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();
    

    【讨论】:

    • 不需要 Class 参数。请参阅罗伯特的答案以获得更好的实施。
    • 我看到了,我问了一下。据我了解,如果不分配它就无法创建它?不是一个人想要经常做的事情,但仍然:)
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2017-05-19
    相关资源
    最近更新 更多