2012-01-16 33 views
2

可能重複:
builder for HashMapJava建造一個由鍵值對的地圖

是否有任何實用工具類,它允許創建一個數字鍵 - 值對的地圖以方便和可讀的方式?

我認爲guava應該包含的東西,但我找不到任何必要的功能。

我想是這樣的:

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

附:我也知道雙支撐方法(new HashMap<>() {{ put(..); put(..); }}),但我沒有發現它可讀或方便。

+0

@Roman關於雙括號的方式 - 這是匿名類的定義和您所呼叫的put()的初始化塊(第二對大括號)。我不喜歡這種方法,因爲它通常會產生有關丟失serialVersionUID的警告,並且您需要@supressWarnings(「serial」)。 – altanis 2012-01-16 11:31:46

+2

請參閱[Guava的ImmutableMap.Builder](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.Builder.html)。對於像這樣的小地圖,還可以看到更方便的[ImmutableMap.of](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.html#method_summary )。 – 2013-01-11 22:37:37

回答

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

不需要Class參數。請參閱Robert的回答以獲得更好的實施。 – 2012-01-16 11:31:37

+0

我看到了,我問了一下。據我所知,如果不分配它,就不可能創建它?不是經常想做的事情,但仍然:) – davogotland 2012-01-16 11:35:29

6

這有什麼錯

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

這看起來非常具有可讀性給我,我看不出有什麼你從MapBuilder中獲益。無論如何,這樣的MapBuilder不會很難實現。

+0

同意,非常可讀。同意,易於實施。 (我希望我的建議的實現沒有錯誤哈哈) – davogotland 2012-01-16 11:29:45

4

爲什麼不直接推出自己的產品?

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

} 
+0

靜態方法'newHashMap()'會如何知道'K'和'V'? – davogotland 2012-01-16 11:32:08

+0

它是'''後面'靜態',這意味着它將從賦值運算符的左側獲取? – davogotland 2012-01-16 11:34:10

+0

它是一個通用的方法,以及一個通用的類 – Robert 2012-01-16 11:34:22

2

如何與返回this看跌方法創建自己的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");