[英]Best way to create an empty map in Java
我需要創建一個空的 map。
if (fileParameters == null)
fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
問題是上面的代碼產生了這個警告: Type safety: Unchecked cast from Map to HashMap
創建這個空 map 的最佳方法是什么?
1)如果Map可以是不可變的:
Collections.emptyMap()
// or, in some cases:
Collections.<String, String>emptyMap()
有時,當編譯器無法自動確定需要哪種Map時(這稱為類型推斷 ),您將不得不使用后者。 例如,考慮一個聲明如下的方法:
public void foobar(Map<String, String> map){ ... }
將空Map直接傳遞給它時,您必須明確該類型:
foobar(Collections.emptyMap()); // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine
2)如果您需要能夠修改Map,那么例如:
new HashMap<String, String>()
(正如tehblanx指出的那樣 )
附錄 :如果您的項目使用番石榴 ,您有以下替代方案:
1)不變的地圖:
ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()
當然,與Collections.emptyMap()
相比,這里沒有什么好處。 來自Javadoc :
此映射的行為與
Collections.emptyMap()
相當,並且主要用於代碼的一致性和可維護性。
2)您可以修改的地圖:
Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()
Maps
包含類似的工廠方法,用於實例化其他類型的地圖,例如TreeMap
或LinkedHashMap
。
更新(2018) :在Java 9或更高版本上,創建不可變空映射的最短代碼是:
Map.of()
如果您需要HashMap的實例,最好的方法是:
fileParameters = new HashMap<String,String>();
由於Map是一個接口,因此如果要創建一個空實例,則需要選擇一個實例化它的類。 HashMap看起來和其他任何一樣好 - 所以就這樣使用它。
無論是Collections.emptyMap()
,還是類型推斷在您的情況下都不起作用,
Collections.<String, String>emptyMap()
由於在許多情況下空映射用於空安全設計,因此可以使用nullToEmpty
實用程序方法:
class MapUtils {
static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) {
if (map != null) {
return map;
} else {
return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of()
}
}
}
同樣對於集合:
class SetUtils {
static <T> Set<T> nullToEmpty(Set<T> set) {
if (set != null) {
return set;
} else {
return Collections.<T>emptySet();
}
}
}
並列出:
class ListUtils {
static <T> List<T> nullToEmpty(List<T> list) {
if (list != null) {
return list;
} else {
return Collections.<T>emptyList();
}
}
}
您可以使用:
Collections<String, String>.emptyMap();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.