9 ответов:
нет такой вещи для хэш-карт, но вы можете создать неизменяемую карту с помощью builder:
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());
не совсем строитель, но с помощью инициализатора:
Map<String, String> map = new HashMap<String, String>() {{ put("a", "1"); put("b", "2"); }};
Это похоже на принятый ответ, но немного чище, на мой взгляд:
ImmutableMap.of("key1", val1, "key2", val2, "key3", val3);существует несколько вариантов вышеуказанного метода, и они отлично подходят для создания статических, неизменных, неизменяемых карт.
вы можете использовать:
HashMap<String,Integer> m = Maps.newHashMap( ImmutableMap.of("a",1,"b",2) );Это не так классно и читабельно, но делает работу.
простой конструктор карт тривиально написать:
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изменчив; нет необходимости в построителе.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
у меня было аналогичное требование некоторое время назад. Его ничего общего с гуавой, но вы можете сделать что-то вроде этого, чтобы иметь возможность чисто построить
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; } }затем создайте fluent builder с методами, которые удовлетворяют вашим потребностям:
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")
Это то, что я всегда хотел, особенно при настройке тестовых приборов. Наконец, я решил написать простой беглый строитель, который мог бы построить любую реализацию карты - https://gist.github.com/samshu/b471f5a2925fa9d9b718795d8bbdfe42#file-mapbuilder-java
/** * @param mapClass Any {@link Map} implementation type. e.g., 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; }
Comments