Java?Map的compute方法舉例詳解
1.compute方法
compute
方法是 Map
接口中的一個(gè)方法,用于根據(jù)指定的鍵和計(jì)算函數(shù)對(duì)指定鍵的值進(jìn)行修改。
方法的簽名如下:
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
key
:要操作的鍵。remappingFunction
:一個(gè)接收鍵和當(dāng)前鍵對(duì)應(yīng)的值作為輸入,并返回一個(gè)新值的函數(shù)。
compute 方法的行為取決于指定的鍵當(dāng)前是否存在于 Map 中:
- 如果指定的鍵存在且對(duì)應(yīng)的值不為 null,則將鍵和對(duì)應(yīng)的值傳遞給 remappingFunction 函數(shù)。該函數(shù)返回的值將作為新的鍵值對(duì)中的值。如果函數(shù)返回的值為
null
,則會(huì)從Map
中刪除該鍵。
2.當(dāng)指定的鍵不存在或其對(duì)應(yīng)的值為 null
時(shí),它會(huì)根據(jù) remappingFunction
函數(shù)的返回值來(lái)確定如何處理:
- 如果
remappingFunction
返回了一個(gè)非null
的值,則會(huì)將新的鍵值對(duì)添加到Map
中。 - 如果
remappingFunction
返回了null
,則會(huì)從Map
中刪除該鍵(如果存在)。
示例:
import java.util.HashMap; import java.util.Map; public class ComputeExample { public static void main(String[] args) { // 創(chuàng)建一個(gè) HashMap 實(shí)例 Map<String, Integer> map = new HashMap<>(); // 添加鍵值對(duì)到 HashMap map.put("key1", 10); map.put("key2", 20); map.put("key3", null); // 使用 compute 方法更新現(xiàn)有的鍵值對(duì) map.compute("key1", (k, v) -> v == null ? 1 : v + 1); // key1 存在,值為 10,將值更新為 11 map.compute("key2", (k, v) -> v == null ? 1 : v + 1); // key2 存在,值為 20,將值更新為 21 map.compute("key3", (k, v) -> v == null ? null : v + 1); // key3 存在,值為 null,將值更新為 1 map.compute("key4", (k, v) -> v == null ? 1 : v + 1); // key4 不存在,直接返回 1 // 輸出更新后的 Map 內(nèi)容 System.out.println("Updated Map: " + map); } }
- 對(duì)于已存在的鍵值對(duì):
- 如果值為
null
,則將值更新為1
。 - 如果值不為
null
,則將原值加1
。
- 如果值為
- 對(duì)于不存在的鍵值對(duì)或者鍵的值為null:
- 對(duì)于Key4,
remappingFunction
返回了一個(gè)非null
的值,則會(huì)將新的鍵值對(duì)添加到Map
中。 - 對(duì)于Key3,
remappingFunction
返回了null
,則會(huì)從Map
中刪除該鍵(如果存在)。
- 對(duì)于Key4,
輸出更新后的 Map
內(nèi)容,可以看到每個(gè)鍵值對(duì)根據(jù) remappingFunction
的結(jié)果進(jìn)行了更新或未發(fā)生改變。:
Updated Map: {key1=11, key2=21,key4=1}
這說(shuō)明 compute
方法根據(jù)指定的函數(shù)對(duì) Map 中的鍵值對(duì)進(jìn)行了更新或操作。
2.computeIfAbsent方法
根據(jù)指定的鍵和計(jì)算函數(shù)在需要時(shí)對(duì)指定鍵的值進(jìn)行修改。
方法的簽名如下:
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
key
:要操作的鍵。mappingFunction
:一個(gè)接收鍵作為輸入,并返回對(duì)應(yīng)值的函數(shù)。
computeIfAbsent
方法的行為:
- 如果指定的鍵存在,并且對(duì)應(yīng)的值不為 null,則直接返回該值,不會(huì)執(zhí)行 mappingFunction 函數(shù)。
- 如果指定的鍵不存在,或者對(duì)應(yīng)的值為 null,則執(zhí)行 mappingFunction 函數(shù),將函數(shù)返回的結(jié)果作為新的鍵值對(duì)中的值,并將其放入 Map 中。
示例:
import java.util.HashMap; import java.util.Map; public class ComputeIfAbsentExample { public static void main(String[] args) { // 創(chuàng)建一個(gè) HashMap 實(shí)例 Map<String, Integer> map = new HashMap<>(); // 添加鍵值對(duì)到 HashMap map.put("key1", 10); map.put("key2", 20); // 使用 computeIfAbsent 方法添加新的鍵值對(duì) map.computeIfAbsent("key1", k -> 100); // key1 存在,值為 10,不會(huì)執(zhí)行 mappingFunction map.computeIfAbsent("key3", k -> 30); // key3 不存在,執(zhí)行 mappingFunction,將值 30 放入 Map // 輸出更新后的 Map 內(nèi)容 System.out.println("Updated Map: " + map); } }
- 對(duì)于已存在的鍵值對(duì):
- 如果值不為 null,則直接返回原值,不會(huì)執(zhí)行 mappingFunction 函數(shù)。
- 對(duì)于不存在的鍵值對(duì)(例如 "key3"):
- 執(zhí)行 mappingFunction 函數(shù),將函數(shù)返回的值作為新的鍵值對(duì)中的值,并將其放入 Map 中。
最后,我們輸出更新后的 Map
內(nèi)容,可以看到只有在鍵值對(duì)不存在時(shí),mappingFunction 函數(shù)才會(huì)被執(zhí)行。
示例輸出:
Updated Map: {key1=10, key2=20, key3=30}
3.computeIfPresent方法
鍵存在且對(duì)應(yīng)的值不為 null 時(shí)對(duì)指定鍵的值進(jìn)行修改。
方法的簽名如下:
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
key
:要操作的鍵。remappingFunction
:一個(gè)接收鍵和當(dāng)前鍵對(duì)應(yīng)的值作為輸入,并返回一個(gè)新值的函數(shù)。
computeIfPresent
方法的行為如下:
- 如果指定的鍵存在且對(duì)應(yīng)的值不為 null,則將鍵和對(duì)應(yīng)的值傳遞給 remappingFunction 函數(shù)。該函數(shù)返回的值將作為新的鍵值對(duì)中的值。如果函數(shù)返回的值為 null,則會(huì)從 Map 中刪除該鍵。
- 如果指定的鍵不存在或其對(duì)應(yīng)的值為 null,則 remappingFunction 函數(shù)將不會(huì)執(zhí)行,computeIfPresent 方法直接返回 null,不會(huì)修改 Map 中的任何內(nèi)容。
示例:
import java.util.HashMap; import java.util.Map; public class ComputeIfPresentExample { public static void main(String[] args) { // 創(chuàng)建一個(gè) HashMap 實(shí)例 Map<String, Integer> map = new HashMap<>(); // 添加鍵值對(duì)到 HashMap map.put("key1", 10); map.put("key2", 20); // 使用 computeIfPresent 方法更新現(xiàn)有的鍵值對(duì) map.computeIfPresent("key1", (k, v) -> v * 2); // key1 存在,值為 10,將值更新為 20 map.computeIfPresent("key2", (k, v) -> v * 2); // key2 存在,值為 20,將值更新為 40 map.computeIfPresent("key3", (k, v) -> v * 2); // key3 不存在,不會(huì)執(zhí)行 remappingFunction // 輸出更新后的 Map 內(nèi)容 System.out.println("Updated Map: " + map); } }
- 對(duì)于已存在的鍵值對(duì):
- 如果值不為
null
,則將鍵和對(duì)應(yīng)的值傳遞給remappingFunction
函數(shù),并將函數(shù)返回的值作為新的鍵值對(duì)中的值。
- 如果值不為
- 對(duì)于不存在的鍵值對(duì)(例如
"key3"
):remappingFunction
函數(shù)將不會(huì)執(zhí)行,computeIfPresent
方法直接返回null
,不會(huì)修改Map
中的任何內(nèi)容。
最后,我們輸出更新后的 Map
內(nèi)容,可以看到只有存在且值不為 null 的鍵值對(duì)才會(huì)被更新。運(yùn)行該示例將輸出:
Updated Map: {key1=20, key2=40}
computeIfPresent
方法根據(jù)指定的函數(shù)對(duì) Map
中存在且值不為 null 的鍵值對(duì)進(jìn)行了更新或操作。
總結(jié)
到此這篇關(guān)于Java Map的compute方法舉例詳解的文章就介紹到這了,更多相關(guān)Java Map的compute方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot如何獲取yml、properties參數(shù)
這篇文章主要介紹了Springboot如何獲取yml、properties參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03十分簡(jiǎn)單易懂的Java應(yīng)用程序性能調(diào)優(yōu)技巧分享
這篇文章主要介紹了十分簡(jiǎn)單易懂的Java性能調(diào)優(yōu)技巧分享,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11idea resources目錄下的application.properties不能自動(dòng)提示問(wèn)題
這篇文章主要介紹了idea resources目錄下的application.properties不能自動(dòng)提示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Java聊天室之實(shí)現(xiàn)一個(gè)服務(wù)器與多個(gè)客戶端通信
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之實(shí)現(xiàn)一個(gè)服務(wù)器與多個(gè)客戶端通信,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-10-10Java創(chuàng)建、識(shí)別條形碼和二維碼方法示例
這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建、識(shí)別條形碼和二維碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09