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