HashMap的build设者

Guava为Javatypes提供了很好的工厂方法,比如Maps.newHashMap()

但也有build设者的Java地图?

 HashMap<String,Integer> m = Maps.BuildHashMap. put("a",1). put("b",2). build(); 

HashMap没有这样的东西,但是你可以用一个构build器创build一个ImmutableMap:

 final Map<String, Integer> m = ImmutableMap.<String, Integer>builder(). put("a", 1). put("b", 2). build(); 

如果你需要一个可变映射,你可以把它提供给HashMap的构造函数。

 final Map<String, Integer> m = Maps.newHashMap( ImmutableMap.<String, Integer>builder(). put("a", 1). put("b", 2). build()); 

不是一个build设者,但使用初始化程序:

 Map<String, String> map = new HashMap<String, String>() {{ put("a", "1"); put("b", "2"); }}; 

这与接受的答案类似,但在我看来,更清洁一点:

 ImmutableMap.of("key1", val1, "key2", val2, "key3", val3); 

上述方法有几种变化,对于制作静态的,不变的,不可改变的地图来说非常有用。

一个简单的地图生成器是微不足道的写作:

 public class Maps { public static <Q,W> MapWrapper<Q,W> map(Q q, W w) { return new MapWrapper<Q, W>(q, w); } public static final class MapWrapper<Q,W> { private final HashMap<Q,W> map; public MapWrapper(Q q, W w) { map = new HashMap<Q, W>(); map.put(q, w); } public MapWrapper<Q,W> map(Q q, W w) { map.put(q, w); return this; } public Map<Q,W> getMap() { return map; } } public static void main(String[] args) { Map<String, Integer> map = Maps.map("one", 1).map("two", 2).map("three", 3).getMap(); for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } } } 

您可以使用:

 HashMap<String,Integer> m = Maps.newHashMap( ImmutableMap.of("a",1,"b",2) ); 

这不是优雅和可读的,但是做的工作。

HashMap是可变的; 有没有build设者的需要。

 Map<String, Integer> map = Maps.newHashMap(); map.put("a", 1); map.put("b", 2); 

这是一个非常简单的…

 public class FluentHashMap<K, V> extends java.util.HashMap<K, V> { public FluentHashMap<K, V> with(K key, V value) { put(key, value); return this; } public static <K, V> FluentHashMap<K, V> map(K key, V value) { return new FluentHashMap<K, V>().with(key, value); } } 

然后

 import static FluentHashMap.map; HashMap<String, Integer> m = map("a", 1).with("b", 2); 

https://gist.github.com/culmat/a3bcc646fa4401641ac6eb01f3719065

我有一个类似的要求。 它与番石榴无关,但你可以做这样的事情,以便能够stream利的build设者干净地构build一个Map

创build一个扩展Map的基类。

 public class FluentHashMap<K, V> extends LinkedHashMap<K, V> { private static final long serialVersionUID = 4857340227048063855L; public FluentHashMap() {} public FluentHashMap<K, V> delete(Object key) { this.remove(key); return this; } } 

然后用适合您需求的方法创buildstream畅的构build器:

 public class ValueMap extends FluentHashMap<String, Object> { private static final long serialVersionUID = 1L; public ValueMap() {} public ValueMap withValue(String key, String val) { super.put(key, val); return this; } ... Add withXYZ to suit... } 

然后你可以像这样实现它:

 ValueMap map = new ValueMap() .withValue("key 1", "value 1") .withValue("key 2", "value 2") .withValue("key 3", "value 3") 

这是我一直想要的,尤其是在设置testing夹具的时候。 最后,我决定写一个我自己的简单stream畅的构build器,可以构build任何Map实现 – https://gist.github.com/samshu/b471f5a2925fa9d9b718795d8bbdfe42#file-mapbuilder-java

  /** * @param mapClass Any {@link Map} implementation type. eg, HashMap.class */ public static <K, V> MapBuilder<K, V> builder(@SuppressWarnings("rawtypes") Class<? extends Map> mapClass) throws InstantiationException, IllegalAccessException { return new MapBuilder<K, V>(mapClass); } public MapBuilder<K, V> put(K key, V value) { map.put(key, value); return this; } public Map<K, V> build() { return map; }