การเริ่มต้น Guava ImmutableMap


140

Guava เสนอทางลัดที่ดีสำหรับการเริ่มต้นแผนที่ อย่างไรก็ตามฉันได้รับข้อผิดพลาดคอมไพเลอร์ต่อไปนี้ (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 มีขนาดสูงสุดสี่คู่ของคีย์ค่า

เห็นได้ชัดว่านี่ไม่ใช่กรณี แต่ฉันไม่สามารถคิดออกว่าจะทำอย่างไรเพื่อเพิ่มขนาดของ initializer ของฉัน

มีคนบอกฉันว่ามีอะไรหายไปบ้าง

คำตอบ:


256

โปรดสังเกตว่าข้อความแสดงข้อผิดพลาดของคุณมีเพียงห้าK, Vคู่รวม 10 ข้อโต้แย้ง นี่คือโดยการออกแบบ คลาส ImmutableMap จัดให้มีหกof()วิธีที่แตกต่างกันยอมรับระหว่างการจับคู่คีย์ - ค่าศูนย์และห้า ไม่มีof(...)โอเวอร์โหลดที่ยอมรับพารามิเตอร์ varags เพราะKและVอาจเป็นประเภทที่แตกต่างกัน

คุณต้องการ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 เพราะฉันไม่ต้องการพิมพ์ 'Put' ทั้งหมดที่ต้องการโดย initializer แผนที่มาตรฐาน มากสำหรับความคิดนั้น!
user903724

7
@ user903724: สาเหตุหลักของการใช้ Guava ที่นี่คือ IMO
Jon Skeet

2
นั่นหรือการใช้หน่วยความจำลดลงเล็กน้อย - และตัวสร้างไวยากรณ์นั้นสามารถพูดได้คล่องเหมือนทุกสิ่งที่เกิดขึ้น
Louis Wasserman

2
ดีคุณอาจมีหลาย ๆ ที่ยังคง แต่ตอนนี้พวกเขาใช้ API ได้อย่างคล่องแคล่วดังนั้นไม่จำเป็นต้องทำซ้ำmyMapในแต่ละครั้ง.put
Kevin Welker

21
โปรดสังเกตว่าโค้ดตัวอย่างของ Jon อาจเป็นอย่างไรpublic static finalและใช้ได้อย่างไรโดยไม่จำเป็นต้องใช้วิธีช่วยหรือstatic{}initializer!
Kevin Bourrillion

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คงที่จากโรงงานสำหรับคู่ค่าคีย์สูงสุดห้าคู่ จากนั้นคุณต้องใช้เครื่องมือสร้าง
Xaerxess

0

"ใส่" ถูกเลิกใช้แล้วงดใช้ใช้แทน

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

3
ไม่ ImmutableMap.put เลิกใช้แล้ว Jon Skeet กำลังใช้ ImmutableMap.Builder.put ซึ่งเป็นวิธีการที่เราควรเริ่มต้นแผนที่ที่มี tuples มากกว่า 5 ตัว
i2B
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.