Java Map運用的思考與Funtional Interface聯想

最近看到了一篇好文章:html

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

雖然內容精簡,可是思路確實很贊。性能

假設咱們有一個Map<String,List<String>>的Map,咱們想實現分組,通常思路是先看這個key是否存在,不存在的話,就新建一個List並放入,存在就返回這個List。優化

通常的實現是:debug

if (map.containsKey(key)) { // 第一次哈希
    return map.get(key); // 第二次哈希
}
List<String> list = new ArrayList<>();
map.put(key, list); //第三次哈希
return list;

若是假設咱們的Map不會存儲null值,那麼能夠經過以下代碼省略一次哈希操做:code

List<String> list = map.get(key); // 第一次哈希
if(list == null) {
    list = new ArrayList<>();
    map.put(key, list); // 第二次哈希
}
return list;

接下來再優化,咱們能夠利用puIfAbsent方法:htm

map.putIfAbsent(key, new ArrayList<>()); // 第一次哈希
return map.get(key); // 第二次哈希

可不能夠把哈希操做削減爲一次呢?Java8以後,能夠這麼操做:blog

return map.computeIfAbsent(key, unused -> new ArrayList<>()); 只有一次哈希操做

Java8以後引入的λ表達式,和Functional Interface,不少地方能夠用來經過省略掉用結合判斷這樣提高性能,減小沒必要要的調用。例如在Log4j2的框架中rem

if (log.isDebugEnabled()) {
log.debug("{} inited!", JSON.toJSONString(a));
}

就能夠替換成:get

log.debug("{} inited!", () -> JSON.toJSONString(a));
相關文章
相關標籤/搜索