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