在Java的Map中,getOrDefault方法是一個非常有用的方法,如果鍵不存在於Map中,則返回默認值而不是null。本文通過深入探討該方法的實現和使用,向讀者展示其強大的功能和靈活性。
一、getOrDefault 方法的語法和基礎用法
getOrDefault 方法的基礎用法非常簡單,下面是它的語法:
V getOrDefault(Object key, V defaultValue)
其中,key 代表 Map 中要查找的鍵,defaultValue 是當鍵不存在於 Map 中時返回的默認值。事實上,如果鍵 key 存在於 Map 中,getOrDefault 將返回與其關聯的值,否則將返回 defaultValue。
下面是一個基本的示例:
Map map = new HashMap(); map.put("A", 1); map.put("B", 2); int value1 = map.getOrDefault("A", 0);//返回1 int value2 = map.getOrDefault("C", 0);//返回0
在以上示例中,對於 map.getOrDefault(“A”, 0) 調用,由於鍵 “A” 存在於 Map 中,該方法將返回 1。而對於 map.getOrDefault(“C”, 0) 調用,由於搜尋鍵 “C” 找不到,所以將返回默認值 0。
二、getOrDefault 方法的實現原理
接下來,我們將討論 getOrDefault 方法實現的內部機制。事實上,在 HashMap 和 ConcurrentHashMap 等常用的 Java Map 實現中,getOrDefault 方法的實現與 get 方法基本相同。
在 HashMap 中,getOrDefault 方法的實現如下:
public V getOrDefault(Object key, V defaultValue) { Node e; return (e = getNode(hash(key), key)) == null ? defaultValue : e.value; }
在以上代碼中,getNode 是 HashMap 中一個私有方法,它用於在 HashMap 中查找給定鍵的節點。如果該節點存在,則將其與 defaultValue 進行比較,否則將返回 defaultValue。
同樣地,在 ConcurrentHashMap 中,getOrDefault 方法的實現也類似:
public V getOrDefault(Object key, V defaultValue) { V v; return (v = get(key)) == null ? defaultValue : v; }
事實上,ConcurrentHashMap 的 getOrDefault 方法完全依靠 get 方法的實現,只是在實現中添加了 defaultValue 的邏輯。
三、getOrDefault 方法的高級用法
除了基本的用法外,getOrDefault 方法還提供了一些高級用法,下面是其中的一些示例。
示例1:使用 Lambda 表達式設置默認值
在Java 8 中,使用 Lambda 表達式可以輕鬆地將默認值與函數的返回值相結合,從而實現一些更為複雜的任務。
Map<String, List> listMap = new HashMap(); List value = listMap.getOrDefault("key", new ArrayList(), List::isEmpty);//返回true
在以上示例中,我們使用了一個 Lambda 表達式,它檢查了 listMap 中 “key” 的值是否為空。該表達式將在返回默認值時使用,並且只有在值為空時才會返回。
示例2:結合 putIfAbsent 方法使用
putIfAbsent 是 Map 介面中的另一個非常實用的方法。它實現了一種常見的任務:在給定的鍵不存在於 Map 中時,將其與給定的值關聯,否則,返回已經與該鍵相關聯的當前值。
與此一致,在一些具有特定需求的情況下,我們希望檢查某個鍵是否存在,如果存在,返回相關的值,如果不存在,則將一個新值放置在其中。
Map map = new HashMap(); int defaultValue = 0; String key = "key"; int existingValue = map.putIfAbsent(key, defaultValue); if (existingValue != null) { // 鍵在Map中已經存在 return existingValue; } // 鍵在Map中不存在,那就使用defaultValue並放置一個新值 return defaultValue;
示例3:獲取某個鍵的值時同時更新該項
在一些特定情境下,我們希望獲取某個鍵的值,並且在確定的情況下對其進行更新。這時,我們可以利用 getOrDefault 的 Value 參數來源於代碼塊的特性。
Map<String, List> map = new HashMap(); String key = "key"; List newList = new ArrayList(); List existingList = map.getOrDefault(key, new ArrayList()); if (!existingList.isEmpty()) { // 鍵在Map中已經存在 map.put(key, existingList); } else { // 鍵在Map中不存在 map.put(key, newList); }
在以上示例中,我們使用 getOrDefault 方法來檢查鍵 key 是否存在。如果鍵已經存在於 Map 中,則 put 方法的操作將更新其值。如果不存在,則默認值將被設置為新的 List 對象。
結語
本文深入討論了 Map 的 getOrDefault 方法:它的語法和基礎用法,它的實現原理,以及一些高級用法。
對於熟練地使用 Java Map 的開發人員來說,getOrDefault 方法已經成為他們編寫更靈活和高效代碼的有力武器。然而,即使是這些開發人員,也應該通過不斷地學習和嘗試來更好地利用它的潛力。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/244200.html