construtor de HashMap

goiaba nos fornece grandes métodos de fábrica para tipos Java, tais como Maps.newHashMap().

Mas também há construtores de mapas java?

HashMap<String,Integer> m = Maps.BuildHashMap.
    put("a",1).
    put("b",2).
    build();
Author: MMKopp, 2011-09-08

9 answers

Não existe tal coisa para HashMaps, mas você pode criar um Imutablemap com um construtor:

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

E se você precisar de um mapa mutável, você pode apenas alimentá-lo para o construtor de HashMap.

final Map<String, Integer> m = Maps.newHashMap(
    ImmutableMap.<String, Integer>builder().
        put("a", 1).
        put("b", 2).
        build());
 141
Author: Sean Patrick Floyd, 2011-11-23 13:19:24

Não é bem um construtor, mas usando um inicializador:

Map<String, String> map = new HashMap<String, String>() {{
    put("a", "1");
    put("b", "2");
}};
 34
Author: Johan Sjöberg, 2014-10-02 16:03:41
Isto é semelhante à resposta aceite,mas um pouco mais limpo, na minha opinião:
ImmutableMap.of("key1", val1, "key2", val2, "key3", val3);
Existem várias variações do método acima, e são grandes para fazer mapas estáticos, imutáveis e imutáveis.
 29
Author: Jake Toronto, 2016-05-22 12:19:45

Pode usar:

HashMap<String,Integer> m = Maps.newHashMap(
    ImmutableMap.of("a",1,"b",2)
);
Não é tão elegante e legível, mas faz o trabalho.
 6
Author: Elazar Leibovich, 2016-03-31 23:11:49

Um simples construtor de mapas é trivial para escrever:

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());
        }
    }
}
 6
Author: Agnes, 2016-03-31 23:20:15

HashMap é mutável; não há necessidade de um construtor.

Map<String, Integer> map = Maps.newHashMap();
map.put("a", 1);
map.put("b", 2);
 3
Author: ColinD, 2011-09-08 12:15:36
Aqui está uma muito simples ...
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);
  }
}

Depois

import static FluentHashMap.map;

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

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

 3
Author: culmat, 2017-06-22 09:10:41
Tive uma exigência semelhante há uns tempos. Não tem nada a ver com goiaba, mas você pode fazer algo assim para ser capaz de construir um Map limpo usando um construtor fluente.

Crie uma classe base que Extenda o mapa.

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;
    }
}
Então crie o construtor fluente com métodos que se adaptem às suas necessidades.
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...

}

Você pode então implementá-lo assim:

ValueMap map = new ValueMap()
      .withValue("key 1", "value 1")
      .withValue("key 2", "value 2")
      .withValue("key 3", "value 3")
 0
Author: tarka, 2017-04-13 09:59:40
Isto é algo que eu sempre quis, especialmente enquanto montava dispositivos de teste. Finalmente, eu decidi escrever um simples construtor fluente do meu próprio que poderia construir qualquer implementação do mapa - 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;
    }
 0
Author: aathif, 2017-05-29 11:32:35