摘要:如果不小心把它們搞混用錯了,可能會帶來大問題。這個方法會檢查中的,如果發(fā)現(xiàn)不存在或者對應(yīng)的值是,則調(diào)用來產(chǎn)生一個值,然后將其放入,最后返回這個值否則的話返回已經(jīng)存在的值。要注意,這個默認值不會放入。
假設(shè)我們定義下面一個 Map:
Map> map = new HashMap<>();
如果我們要放一個元素進去,很多人會這么寫:
Listlist = map.get("list1"); if (list == null) { list = new ArrayList<>(); map.put("list1", list); } list.add("A");
實際上從 Java 8 開始,Map 提供了 computeIfAbsent() 方法,我們可以寫成一行即可:
map.computeIfAbsent("list1", k -> new ArrayList<>()).add("A");
其中變量 k 是 Map 的 key。
是不是很方便?但是除此之外,Map 還有兩個方法:getOrDefault() 和 putIfAbsent(),這三個方法都接受 Key 和一個“默認值”作為參數(shù),且返回一個 Value。如果不小心把它們搞混用錯了,可能會帶來大問題。下面分別介紹下。
? V computeIfAbsent(K, Function super K, ? extends V>)這個方法有兩個參數(shù),Key 和一個根據(jù) Key 來產(chǎn)生 Value 的 Function;然后返回一個 Value。
這個方法會檢查 Map 中的 Key,如果發(fā)現(xiàn) Key 不存在或者對應(yīng)的值是 null,則調(diào)用 Function 來產(chǎn)生一個值,然后將其放入 Map,最后返回這個值;否則的話返回 Map 已經(jīng)存在的值。
這個方法同樣檢查 Map 中的 Key,如果發(fā)現(xiàn) Key 不存在或者對應(yīng)的值是 null,則返回第二個參數(shù)即默認值。要注意,這個默認值不會放入 Map。所以如果你這樣寫:
Map> map = new HashMap<>(); map.getOrDefault("list1", new ArrayList<>()).add("A");
執(zhí)行完之后 map 仍然是空的!
? V putIfAbsent(K, V)這個方法的邏輯完全不同,注意它不是一個 get() 方法,而是 put() 方法的變種!這個方法的邏輯是,如果 Key 不存在或者對應(yīng)的值是 null,則將 Value 設(shè)置進去,然后返回 null;否則只返回 Map 當中對應(yīng)的值,而不做其他操作。
所以顯而易見,在最開始的例子中,如果將 computeIfAbsent() 替換成其他兩個方法都是錯的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73420.html
摘要:我們提一個需求給定一個,統(tǒng)計每個元素出現(xiàn)的所有位置。而且因為方法會返回新的此時便是與相關(guān)聯(lián)的所以我們可以直接調(diào)用其方法。在本文類似需求的情況下,就適用性和簡潔性而言,要優(yōu)于。 我們提一個需求:給定一個 List,統(tǒng)計每個元素出現(xiàn)的所有位置。 比如,給定 list:[a, b, b, c, c, c, d, d, d, f, f, g] ,那么應(yīng)該返回:a : [0]b : [1, 2]...
摘要:并發(fā)教程原子變量和原文譯者飛龍協(xié)議歡迎閱讀我的多線程編程系列教程的第三部分。如果你能夠在多線程中同時且安全地執(zhí)行某個操作,而不需要關(guān)鍵字或上一章中的鎖,那么這個操作就是原子的。當多線程的更新比讀取更頻繁時,這個類通常比原子數(shù)值類性能更好。 Java 8 并發(fā)教程:原子變量和 ConcurrentMap 原文:Java 8 Concurrency Tutorial: Synchroni...
摘要:首先我們定義一個有兩個不同控制器的然后,我們創(chuàng)建一個特定的工廠接口來創(chuàng)建新的對象不需要手動的去繼承實現(xiàn)該工廠接口,我們只需要將控制器的引用傳遞給該接口對象就好了的控制器會自動選擇合適的構(gòu)造器方法。這種指向時間軸的對象即是類。 本文為翻譯文章,原文地址 這里 歡迎來到本人對于Java 8的系列介紹教程,本教程會引導(dǎo)你一步步領(lǐng)略最新的語法特性。通過一些簡單的代碼示例你即可以學(xué)到默認的接口方...
摘要:需要注意的是所鏈接的是一顆紅黑樹,紅黑樹的結(jié)點用表示,所以中實際上一共有五種不同類型的結(jié)點。時不再延續(xù),轉(zhuǎn)而直接對每個桶加鎖,并用紅黑樹鏈接沖突結(jié)點。 showImg(https://segmentfault.com/img/bVbfTCY?w=1920&h=1080); 本文首發(fā)于一世流云專欄:https://segmentfault.com/blog... 一、Concurren...
閱讀 3371·2021-11-25 09:43
閱讀 1343·2021-11-23 09:51
閱讀 3644·2021-10-11 11:06
閱讀 3786·2021-08-31 09:41
閱讀 3623·2019-08-30 15:53
閱讀 3543·2019-08-30 15:53
閱讀 989·2019-08-30 15:43
閱讀 3344·2019-08-29 14:02