menginisialisasi Guava ImmutableMap

140

Guava menawarkan jalan pintas yang bagus untuk menginisialisasi peta. Namun saya mendapatkan kesalahan kompilator berikut (Eclipse Indigo) ketika peta saya menginisialisasi ke sembilan entri.

Metode of(K, V, K, V, K, V, K, V, K, V)dalam tipe ImmutableMapini tidak berlaku untuk argumen (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"
        );

Pesan muncul untuk mengatakan itu

ImmutableMap memiliki ukuran maksimum empat pasang kunci, nilai.

Jelas, ini tidak bisa terjadi tetapi saya tidak tahu apa yang harus dilakukan untuk meningkatkan ukuran initializer saya.

Adakah yang bisa memberi tahu saya apa yang hilang?

user903724
sumber

Jawaban:

256

Perhatikan bahwa pesan kesalahan Anda hanya berisi lima K, Vpasang, total 10 argumen. Ini dengan desain; kelas ImmutableMap menyediakan enam of()metode berbeda , menerima antara nol dan lima pasangan nilai kunci. Tidak ada of(...)kelebihan menerima parameter varag karena Kdan Vbisa tipe yang berbeda.

Anda menginginkan 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();
Jon Skeet
sumber
Terima kasih atas jawaban cepatnya. Saya memutuskan untuk mencoba Guava karena saya tidak ingin harus mengetik semua 'menempatkan' yang diperlukan oleh penginisialisasi peta standar. Begitu banyak untuk gagasan itu!
user903724
7
@ user903724: Alasan utama untuk menggunakan Guava di sini adalah kekekalan yang kuat, IMO.
Jon Skeet
2
Itu, atau konsumsi memori sedikit berkurang - dan sintaks pembangun cukup lancar, seperti yang terjadi.
Louis Wasserman
2
baik, Anda mungkin memiliki beberapa put masih, tetapi mereka sekarang menggunakan API lancar, jadi tidak perlu mengulangi myMapuntuk masing.put
Kevin Welker
21
Perhatikan juga bagaimana kode contoh Jon bisa menjadi public static finaldan masih berfungsi, tidak perlu metode penolong atau static{}inisialisasi!
Kevin Bourrillion
62

jika peta singkat, Anda dapat melakukan:

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

Jika lebih lama maka:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();
Nathan Feger
sumber
9
Terlepas dari keterbacaan, Anda dapat menggunakan ImmutableMap.ofpabrik statis hingga lima pasangan nilai kunci. Maka Anda harus menggunakan pembangun.
Xaerxess
0

"put" telah ditinggalkan , jangan menggunakannya, gunakan .of sebagai gantinya

ImmutableMap<String, String> myMap = ImmutableMap.of(
    "city1", "Seattle",
    "city2", "Delhi"
);
coda
sumber
3
ImmutableMap.put tidak digunakan lagi. Jon Skeet menggunakan ImmutableMap.Builder.put, yang merupakan cara kita menginisialisasi peta dengan lebih dari 5 tupel.
i2B