写点什么

Java Map 操作解锁新姿势

作者:派大星
  • 2023-02-15
    辽宁
  • 本文字数:930 字

    阅读完需:约 3 分钟

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

用户头像

派大星

关注

微信搜索【码上遇见你】,获取更多精彩内容 2021-12-13 加入

微信搜索【码上遇见你】,获取更多精彩内容

评论

发布
暂无评论
Java Map操作解锁新姿势_派大星_InfoQ写作社区