구아바 ImmutableMap 초기화


140

구아바는지도를 초기화하기위한 좋은 지름길을 제공합니다. 그러나 내지도가 9 개의 항목으로 초기화되면 다음 컴파일러 오류 (Eclipse Indigo)가 발생합니다.

of(K, V, K, V, K, V, K, V, K, V)유형 의 메소드 ImmutableMap는 인수에 적용 할 수 없습니다 (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

메시지는

ImmutableMap의 최대 크기는 키, 값의 4 쌍입니다.

분명히, 이것은 사실이 될 수 없지만 초기화 장치의 크기를 늘리기 위해 어떻게해야하는지 알 수 없습니다.

누군가가 누락 된 것을 말해 줄 수 있습니까?

답변:


256

오류 메시지에는 5 개의 K, V쌍 (총 10 개의 인수) 만 포함되어 있습니다 . 이것은 의도적으로 설계된 것입니다. ImmutableMap 클래스는 6 가지 of()방법을 제공 하며 0 ~ 5 개의 키-값 쌍을 허용합니다. 가 아닌 of(...)A가 있기 때문에 매개 변수 varags 받아들이는 과부하 KV다른 유형이 될 수는.

당신이 원하는 ImmutableMap.Builder:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();

빠른 답변 감사합니다. 표준 맵 초기화 프로그램에 필요한 모든 '입력'을 입력하고 싶지 않기 때문에 Guava를 사용해보기로 결정했습니다. 그 아이디어를 위해 너무 많은!
user903724

7
@ user903724 : 여기서 구아바를 사용하는 주된 이유는 강력한 불변성 IMO입니다.
Jon Skeet

2
메모리 사용량이 약간 줄었거나 빌더 구문이 매우 유창합니다.
Louis Wasserman 2019

2
물론, 당신은 여전히 여러 풋가있을 수 있지만, 필요 반복하지 않으려면, 그래서 그들은 지금, 유창 API를 사용하는 myMap각각의.put
케빈 Welker에게

21
Jon의 예제 코드가 어떻게 public static final작동 할 수 있으며 도우미 메소드 나 static{}초기화 프로그램이 필요하지 않은지 여전히 작동합니다 !
Kevin Bourrillion 2019

62

지도가 짧은 경우 다음을 수행 할 수 있습니다.

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

더 길다면 :

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

9
가독성 외에도 ImmutableMap.of최대 5 개의 키 값 쌍에 정적 팩토리를 사용할 수 있습니다 . 그런 다음 빌더를 사용해야합니다.
Xaerxess 2019

0

"put"은 더 이상 사용되지 않습니다. 사용 하지 말고 대신 .of를 사용하십시오.

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);

3
아니요. ImmutableMap.put은 더 이상 사용되지 않습니다. Jon Skeet은 ImmutableMap.Builder.put을 사용하고 있는데, 이는 5 개 이상의 튜플로 맵을 초기화하는 방법입니다.
i2B
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.