Map在Java 8中增加非常實用哪些函數(shù)接口?
閱讀本文大概需要 5.5 分鐘。
來自:網(wǎng)絡(luò)

Map中的新方法
forEach()
//?Java7以及之前迭代Map
HashMap?map?=?new?HashMap<>();
map.put(1,?"one");
map.put(2,?"two");
map.put(3,?"three");
for(Map.Entry?entry?:?map.entrySet()){
????System.out.println(entry.getKey()?+?"="?+?entry.getValue());
}
//?使用forEach()結(jié)合匿名內(nèi)部類迭代Map
HashMap?map?=?new?HashMap<>();
map.put(1,?"one");
map.put(2,?"two");
map.put(3,?"three");
map.forEach(new?BiConsumer(){
????@Override
????public?void?accept(Integer?k,?String?v){
????????System.out.println(k?+?"="?+?v);
????}
});
//?使用forEach()結(jié)合Lambda表達(dá)式迭代Map
HashMap?map?=?new?HashMap<>();
map.put(1,?"one");
map.put(2,?"two");
map.put(3,?"three");
map.forEach((k,?v)?->?System.out.println(k?+?"="?+?v));
}
getOrDefault()
//?查詢Map中指定的值,不存在時使用默認(rèn)值
HashMap?map?=?new?HashMap<>();
map.put(1,?"one");
map.put(2,?"two");
map.put(3,?"three");
//?Java7以及之前做法
if(map.containsKey(4)){?//?1
????System.out.println(map.get(4));
}else{
????System.out.println("NoValue");
}
//?Java8使用Map.getOrDefault()
System.out.println(map.getOrDefault(4,?"NoValue"));?//?2
remove()
replace()
replace(K key, V value),只有在當(dāng)前Map中key的映射存在時才用value去替換原來的值,否則什么也不做. replace(K key, V oldValue, V newValue),只有在當(dāng)前Map中key的映射存在且等于oldValue時才用newValue去替換原來的值,否則什么也不做.
//?Java7以及之前替換所有Map中所有映射關(guān)系
HashMap?map?=?new?HashMap<>();
map.put(1,?"one");
map.put(2,?"two");
map.put(3,?"three");
for(Map.Entry?entry?:?map.entrySet()){
????entry.setValue(entry.getValue().toUpperCase());
}
//?使用replaceAll()結(jié)合匿名內(nèi)部類實現(xiàn)
HashMap?map?=?new?HashMap<>();
map.put(1,?"one");
map.put(2,?"two");
map.put(3,?"three");
map.replaceAll(new?BiFunction(){
????@Override
????public?String?apply(Integer?k,?String?v){
????????return?v.toUpperCase();
????}
});
//?使用replaceAll()結(jié)合Lambda表達(dá)式實現(xiàn)
HashMap?map?=?new?HashMap<>();
map.put(1,?"one");
map.put(2,?"two");
map.put(3,?"three");
map.replaceAll((k,?v)?->?v.toUpperCase());
merge()
如果Map中key對應(yīng)的映射不存在或者為null,則將value(不能是null)關(guān)聯(lián)到key上; 否則執(zhí)行remappingFunction,如果執(zhí)行結(jié)果非null則用該結(jié)果跟key關(guān)聯(lián),否則在Map中刪除key的映射.
map.merge(key,?newMsg,?(v1,?v2)?->?v1+v2);
compute()
map.compute(key,?(k,v)?->?v==null???newMsg?:?v.concat(newMsg));
computeIfAbsent()
Map
>?map?=?new?HashMap<>();
//?Java7及以前的實現(xiàn)方式
if(map.containsKey(1)){
????map.get(1).add("one");
}else{
????Set?valueSet?=?new?HashSet ();
????valueSet.add("one");
????map.put(1,?valueSet);
}
//?Java8的實現(xiàn)方式
map.computeIfAbsent(1,?v?->?new?HashSet()).add("yi");
computeIfPresent()
//?Java7及以前跟computeIfPresent()等效的代碼
if?(map.get(key)?!=?null)?{
????V?oldValue?=?map.get(key);
????V?newValue?=?remappingFunction.apply(key,?oldValue);
????if?(newValue?!=?null)
????????map.put(key,?newValue);
????else
????????map.remove(key);
????return?newValue;
}
return?null;
推薦閱讀:
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?

