Ada beberapa cara untuk inisialisasi Jawa HashMap seperti ini?:
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Apa yang akan menjadi sintaks yang benar? Aku tidak menemukan apa-apa mengenai hal ini. Apakah ini mungkin? Saya mencari terpendek/tercepat untuk menempatkan beberapa "final/statis" nilai-nilai dalam sebuah peta yang tidak pernah berubah dan dikenal di muka ketika membuat Peta.
Ya, ini mungkin sekarang. Di Jawa 9 beberapa pabrik metode telah menambahkan bahwa menyederhanakan pembuatan peta :
// this works for up to 10 elements:
Map<String, String> test1 = Map.of(
"a", "b",
"c", "d"
);
// this works for any number of elements:
Map<String, String> test2 = Map.ofEntries(
entry("a", "b"),
entry("c", "d")
);
Dalam contoh di atas kedua test
dan test2
akan sama, hanya dengan cara yang berbeda untuk mengungkapkan Peta. Peta.dari
metode didefinisikan untuk hingga sepuluh unsur-unsur dalam peta, sedangkan Peta.ofEntries
metode akan memiliki tidak ada batas.
Perhatikan bahwa dalam kasus ini peta yang dihasilkan akan berubah peta. Jika anda ingin peta akan berubah, anda bisa copy lagi, misalnya menggunakan mutableMap = new HashMap<>(Peta.dari("a", "b"));
Tidak, anda harus menambahkan semua elemen secara manual. Anda dapat menggunakan sebuah penginisialisasi dalam anonim subclass untuk membuat sintaks sedikit lebih pendek:
Map<String, String> myMap = new HashMap<>() {{
put("a", "b");
put("c", "d");
}};
Namun, anonim subclass mungkin memperkenalkan perilaku yang tidak diinginkan dalam beberapa kasus. Ini termasuk misalnya:
Menggunakan fungsi untuk inisialisasi juga akan memungkinkan anda untuk menghasilkan peta di initializer, tapi menghindari efek samping yang buruk:
Map<String, String> myMap = createMap();
private static Map<String, String> createMap() {
Map<String,String> myMap = new HashMap<String,String>();
myMap.put("a", "b");
myMap.put("c", "d");
return myMap;
}
Ini adalah salah satu cara.
HashMap<String, String> h = new HashMap<String, String>() {{
put("a","b");
}};
Namun, anda harus berhati-hati dan pastikan bahwa anda memahami kode di atas (menciptakan kelas baru yang diturunkan dari HashMap). Oleh karena itu, anda harus membaca lebih lanjut di sini: http://www.c2.com/cgi/wiki?DoubleBraceInitialization , atau hanya menggunakan Jambu biji:
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);
Jika anda mengizinkan pihak ke-3 libs, anda dapat menggunakan Jambu's ImmutableMap untuk mencapai literal seperti singkatnya:
Map<String, String> test = ImmutableMap.of("k1", "v1", "k2", "v2");
Ini bekerja untuk sampai 5 pasangan kunci/nilai, jika tidak, anda dapat menggunakan pembangun:
Map<String, String> test = ImmutableMap.<String, String>builder()
.put("k1", "v1")
.put("k2", "v2")
...
.build();
Tidak ada cara langsung untuk melakukan hal ini - Java tidak memiliki Peta literal (lagi - saya pikir mereka diusulkan untuk Java 8).
Beberapa orang-orang seperti ini:
Map<String,String> test = new HashMap<String, String>(){{
put("test","test"); put("test","test");}};
Hal ini menciptakan anonim subclass dari HashMap, dan contoh penginisialisasi menempatkan nilai-nilai ini. (By the way, peta dapat't mengandung dua kali nilai yang sama, kedua masukan akan menimpa pertama. I'll menggunakan nilai-nilai yang berbeda untuk contoh berikutnya.)
Cara yang normal akan hal ini (untuk variabel lokal):
Map<String,String> test = new HashMap<String, String>();
test.put("test","test");
test.put("test1","test2");
Jika anda test
peta adalah instance variabel, menempatkan inisialisasi dalam constructor atau contoh penginisialisasi:
Map<String,String> test = new HashMap<String, String>();
{
test.put("test","test");
test.put("test1","test2");
}
Jika anda test
peta adalah variabel kelas, meletakkan inisialisasi dalam statis penginisialisasi:
static Map<String,String> test = new HashMap<String, String>();
static {
test.put("test","test");
test.put("test1","test2");
}
Jika anda ingin peta anda untuk tidak pernah berubah, anda harus setelah inisialisasi bungkus peta anda dengan Koleksi.unmodifiableMap(...)
. Anda dapat melakukan ini dalam statis penginisialisasi juga:
static Map<String,String> test;
{
Map<String,String> temp = new HashMap<String, String>();
temp.put("test","test");
temp.put("test1","test2");
test = Collections.unmodifiableMap(temp);
}
(Saya'm tidak yakin jika anda sekarang dapat membuat test
final ... mencobanya dan laporan di sini.)
Alternatif, menggunakan plain Jawa kelas 7 dan varargs: membuat kelas HashMapBuilder
dengan metode ini:
public static HashMap<String, String> build(String... data){
HashMap<String, String> result = new HashMap<String, String>();
if(data.length % 2 != 0)
throw new IllegalArgumentException("Odd number of arguments");
String key = null;
Integer step = -1;
for(String value : data){
step++;
switch(step % 2){
case 0:
if(value == null)
throw new IllegalArgumentException("Null key value");
key = value;
continue;
case 1:
result.put(key, value);
break;
}
}
return result;
}
Menggunakan metode seperti ini:
HashMap<String,String> data = HashMapBuilder.build("key1","value1","key2","value2");