前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Map运用的思考与Funtional Interface联想

Java Map运用的思考与Funtional Interface联想

作者头像
干货满满张哈希
发布2021-04-12 14:16:05
2500
发布2021-04-12 14:16:05
举报
文章被收录于专栏:干货满满张哈希

最近看到了一篇好文章:

Map best practices - http://blog.tremblay.pro/2019/08/map.html

虽然内容精简,但是思路确实很赞。

假设我们有一个Map>的Map,我们想实现分组,一般思路是先看这个key是否存在,不存在的话,就新建一个List并放入,存在就返回这个List。

一般的实现是:

代码语言:javascript
复制
if (map.containsKey(key)) { // 第一次哈希
    return map.get(key); // 第二次哈希
}
List list = new ArrayList<>();
map.put(key, list); //第三次哈希
return list;

如果假设我们的Map不会存储null值,那么可以通过如下代码省略一次哈希操作:

代码语言:javascript
复制
List list = map.get(key); // 第一次哈希
if(list == null) {
    list = new ArrayList<>();
    map.put(key, list); // 第二次哈希
}
return list;

接下来再优化,我们可以利用puIfAbsent方法:

代码语言:javascript
复制
map.putIfAbsent(key, new ArrayList<>()); // 第一次哈希
return map.get(key); // 第二次哈希

可不可以把哈希操作削减为一次呢?Java8之后,可以这么操作:

代码语言:javascript
复制
return map.computeIfAbsent(key, unused -> new ArrayList<>()); 只有一次哈希操作

Java8之后引入的λ表达式,和Functional Interface,很多地方可以用来通过省略掉用结合判断这样提升性能,减少不必要的调用。例如在Log4j2的框架中

代码语言:javascript
复制
if (log.isDebugEnabled()) {
log.debug("{} inited!", JSON.toJSONString(a));
}

就可以替换成:

代码语言:javascript
复制
log.debug("{} inited!", () -> JSON.toJSONString(a));
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档