Java Map操作解锁新姿势

144 阅读1分钟

Java Map解锁新姿势,相信绝大数人并不知晓;相信我,你懂的。

简单MAP的操作

说到Java Map的操作,其实有很多种,但是归结起来无非就两种,其中一种便是简单Map的操作,

简单Map

简单Map指的是:value是个atomic value,比如:

Map<K, Integer>
​
Map<K, Character>

上面的K是个generic type(也就是泛型)。

复杂的Map

所谓的复杂的Map指的就是,value不是一个atomic value,常见的一个情况就是value是一个collection,比如:

Map<K, Collection<V>>
Map<K, List<V>>
Map<K, Set<V>>

其实简单的Map操作起来还是比较方便的,这里不再一一举例。 但是通常情况下我们使用的Map更多情况下是一个复杂Map,如果像下面这样编写的一个代码,它就有可能抛出一个NullPointerException

Map<K, List<V>> map = new HashMap<>();
map.get(key).add(val);

上述代码之所以会出现空指针的异常,主要原因就是当map并不包含key时。(map.get(key).add(val))也就等价于null.add(val) 在我们日常工作开发中通常采用的解决方案,代码如下:

Map<K, List<V>> map = new HashMap<>();
if (!map.containsKey(key)) {
    map.put(key, new ArrayList<>());
}
map.get(key).add(val);

上述方案便可规避掉NullPointerException异常,但是代码看上去过于冗长。

重点来了!解锁复杂Map避免空指针异常的简化代码

Map<K, List<V>> map = new HashMap<>();
map.computerIfAbsent(key, k-> new ArrayList<>());
map.get(key).add(val);

代码是不是看上去简化清爽了许多。 关于computeIfAbsent的Java文档可以参考:computeIfAbsent

当然如此清爽代码的解决方案不止一种,比如还有Guava Multimap

使用Guava Multimap解锁新姿势(该方式代码更加简洁)

Multimap<K, V> multimap = ArrayListMultimap.create();
multimap.put(key,val);

该方法唯一不足的一点就是Guava并不是Java标准库的一部分,所以如果想使用Guava Multimap来解决的话需要通过Maven dependency在你的项目中引入Guava;如下方式

<!--
  https://mvnrepository.com/artifact/com.google.guava/guava --
  >
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1.1-jre</version>
</dependency>

关于Multimap的Java文档在此处:Multimap

微信搜索关注【码上遇见你】,解锁更多姿势。