Bir Java HashMap'i bu şekilde başlatmanın bir yolu var mı?
Map<String,String> test =
new HashMap<String, String>{"test":"test","test":"test"};
Doğru sözdizimi ne olurdu? Bununla ilgili bir şey bulamadım. Bu mümkün mü? Bir haritaya asla değişmeyen ve Harita oluşturulurken önceden bilinen bazı "final/static" değerleri koymanın en kısa/hızlı yolunu arıyorum.
Evet, bu artık mümkün. Java 9'da haritaların oluşturulmasını basitleştiren birkaç fabrika yöntemi eklenmiştir:
// 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")
);
Yukarıdaki örnekte hem test
hem de test2
aynı olacaktır, sadece Map'i ifade etmenin farklı yolları olacaktır. Map.ofyöntemi haritadaki en fazla on öğe için tanımlanırken,
Map.ofEntries` yönteminin böyle bir sınırı olmayacaktır.
Bu durumda ortaya çıkan haritanın değişmez bir harita olacağını unutmayın. Haritanın değişebilir olmasını istiyorsanız, örneğin mutableMap = new HashMap<>(Map.of("a", "b"));
kullanarak tekrar kopyalayabilirsiniz.
(Ayrıca bakınız JEP 269 ve Javadoc)
Hayır, tüm öğeleri manuel olarak eklemeniz gerekecektir. Sözdizimini biraz daha kısaltmak için anonim bir alt sınıfta bir başlatıcı kullanabilirsiniz:
Map<String, String> myMap = new HashMap<>() {{
put("a", "b");
put("c", "d");
}};
Ancak, anonim alt sınıf bazı durumlarda istenmeyen davranışlara yol açabilir. Bu, örneğin şunları içerir:
Başlatma için bir fonksiyon kullanmak da başlatıcıda bir harita oluşturmanızı sağlar, ancak kötü yan etkilerden kaçınır:
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;
}
Bu da bir yol.
HashMap<String, String> h = new HashMap<String, String>() {{
put("a","b");
}};
Ancak, dikkatli olmalı ve yukarıdaki kodu anladığınızdan emin olmalısınız (HashMap'ten miras alan yeni bir sınıf oluşturur). Bu nedenle, burada daha fazlasını okumalısınız: http://www.c2.com/cgi/wiki?DoubleBraceInitialization ya da sadece Guava kullanın:
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);