АСМАП-реализация для Java (на основе массивов.asList)


Я всегда устал от очень многословный синтаксис в Java для создания небольших карт. Массивы.asList(Т... А) является очень удобным, и поэтому я хочу что-то похожее на карту.

public class MapUtils {
    public static <K, V> MapBuilder<K, V> asMap(K key, V value) {
        return new MapBuilder<K, V>().entry(key, value);
    }

    public static class MapBuilder<K, V> extends HashMap<K, V> {
        public MapBuilder<K, V> entry(K key, V value) {
            this.put(key, value);
            return this;
        }
    }
}

/* Example of how to use asMap */
public class Example {
    public void example() {
        Map<String, String> map = MapUtil.asMap("key", "value").entry("key2", "value2");
    }
}

/* Example of how the one way to create an inline Map in Java */
public class Before {
    public void before() {
        Map<String, String> map = new HashMap<String, String>() {{
            put("key", value");
            put("key2", value2");
        }};
    }
} 

Информацию о том, как улучшить эту реализацию MapUtils? Вы считаете АСМАП функция хорошая идея, или я слишком ленив, чтобы написать несколько лишних символов?



7730
11
задан 1 июля 2011 в 02:07 Источник Поделиться
Комментарии
3 ответа

На мой взгляд MapBuilder должна содержать в карте, не распространяется один. Другой вариант дизайна будет использование одного вызова с varargs:

public class MapUtil {
public static <K,V> Map<K,V> asMap(Map.Entry<K,V>... entries) {
Map<K,V> map = new HashMap<K,V>();
for(Map.Entry<K,V> entry : entries) {
map.put(entry.getKey(), entry.getValue());
}
return map;
}

public static <K,V> Map.Entry<K,V> e(final K k, final V v) {
return new Map.Entry<K, V>() {
public K getKey() {
return k;
}
public V getValue() {
return v;
}
public V setValue(V value) {
throw new UnsupportedOperationException("Not supported");
}
};
}
}

import static very.useful.MapUtil.*;
...
Map<String, Integer> map = asMap(e("x",1),e("y",2),e("z",3));

8
ответ дан 1 июля 2011 в 07:07 Источник Поделиться

Google-в коллекции есть все об этом, например, ImmutableMap.из().
Кроме того, они учат, используя данные структуры, как истинный immutable коллекции, упорядоченные списки и т. д. Мне очень понравилось.


Гугл коллекции теперь является частью Google гуава, и она включает в себя ImmutableMap.Строитель. При этом вы можете сделать:

   static final ImmutableMap<String, Integer> WORD_TO_INT =
new ImmutableMap.Builder<String, Integer>()
.put("one", 1)
.put("two", 2)
.put("three", 3)
.build();

Вы можете позвонить в положить(К, В) метод столько раз, сколько вам нравится. Строители отлично подходит для такой ситуации.

5
ответ дан 1 июля 2011 в 06:07 Источник Поделиться

Мне нравится Landei версия, но я также нетипизированный вариант как АСМАП АСМАП(ключ,значение,ключ,значение,...). Он не набирается карте, но во многих случаях он подходит очень хорошо.

Так

Map quickMap = asMap("prop1","val1","prop2",12,"prop3");

В этом случае "prop3" будет иметь значение null.

Реализация:

static final public Map<String, Object> asMap(Object... objs) {
HashMap<String, Object> m = new HashMap<String, Object>();

for (int i = 0; i < objs.length; i += 2) {
String key = objs[i].toString();
if (i + 1 < objs.length) {
Object value = objs[i + 1];
m.put(key, value);
} else {
m.put(key, null);
}
}
return m;
}

1
ответ дан 27 марта 2014 в 04:03 Источник Поделиться