it-swarm.dev

在Java中创建空映射的最佳方法

我需要创建一个空地图。

if (fileParameters == null)
    fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;

问题是上面的代码产生了这个警告: 类型安全:从Map映射到HashMap的未选中转换

创建此空地图的最佳方法是什么?

97
JorgeO

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指出


附录 :如果你的项目使用 Guava ,你有以下选择:

1) 不可变地图:

ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()

当然,与Collections.emptyMap()相比,这里没有什么好处。 来自Javadoc

此映射的行为与Collections.emptyMap()相当,并且主要用于代码的一致性和可维护性。

2) 你可以修改的地图:

Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()

Maps 包含类似的工厂方法,用于实例化其他类型的地图,例如 TreeMapLinkedHashMap


更新(2018) :开 Java 9 或更新,创建不可变空映射的最短代码是:

Map.of()

...使用新的 便利工厂方法 来自 JEP 269 。 ????

196
Jonik
14
TofuBeer
14
basszero

如果您需要HashMap的实例,最好的方法是:

fileParameters = new HashMap<String,String>();

由于Map是一个接口,因此如果要创建一个空实例,则需要选择一个实例化它的类。 HashMap看起来和其他任何一样好 - 所以就这样使用它。

9
AndreiM

Collections.emptyMap(),或者如果类型推断在您的情况下不起作用,
Collections.<String, String>emptyMap()

6
Peter Štibraný

由于在许多情况下空映射用于空安全设计,因此可以使用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();
    }
  }

}
2
Vitalii Fedorenko
1
OscarRyz