[java] HashMap 용 빌더

Guava는 Maps.newHashMap().

그러나 Java Maps 용 빌더도 있습니까?

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



답변

Java 9 Map인터페이스에는 다음이 포함됩니다.

  • Map.of(k1,v1, k2,v2, ..)
  • Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ..).

이러한 팩토리 방법의 한계는 다음과 같습니다.

  • nulls를 키 및 / 또는 값으로 유지할 수 없습니다 (null을 저장 해야하는 경우 다른 답변을 살펴보십시오)
  • 변경 불가능한 지도 생성

변경 가능한 맵 (예 : HashMap)이 필요한 경우 복사 생성자를 사용하여 생성 된 맵의 내용을Map.of(..)

Map<Integer, String> map = new HashMap<>( Map.of(1,"a", 2,"b", 3,"c") );


답변

HashMaps에는 그런 것이 없지만 빌더로 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());


답변

빌더는 아니지만 이니셜 라이저를 사용합니다.

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


답변

이것은 받아 들인 대답과 비슷하지만 내 견해로는 약간 더 명확합니다.

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

위의 방법에는 몇 가지 변형이 있으며 정적이고 변경되지 않으며 변경 불가능한지도를 만드는 데 유용합니다.


답변

여기에 아주 간단한 것이 있습니다 …

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를


답변

간단한지도 작성기는 작성하기 쉽습니다.

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

고급스럽고 읽기 쉽지는 않지만 작업을 수행합니다.