java8 Map新增方法的使用
文章目錄
文章目錄
- 文章目錄
- java8 Map新增方法的使用
- 概述
- 1、compute()
- 1、使用
- 2、源碼實現
- 2、computeIfAbsent()
- 1、使用
- 2、源碼
- 3、computeIfPresent()
- 4、merge()
- 1、使用
- 2、源碼
- 5、接下來簡單介紹一下1.8之后Map添加的default方法
- map新增的方法:
- getOrDefault
- forEach
- putIfAbsent
- remove(key,value)
- replace(K key, V value)
- replace(K key, V oldValue, V newValue)
- replaceAll
- merge
- compute
- computeIfAbsent
java8 Map新增方法的使用
概述
java8 Map中新增了幾個面向函數式編程的幾個方法
利用java8可以在接口中定義default方法實現
1、compute()
1、使用
Map<Integer, Integer> map = new HashMap<>(16); map.compute(1, (k, v) -> {if (v == null) {return 1;}return ++v; });以上方法表示:如果key不存在就設置value為1;如果存在則value值+1并設置為value
2、源碼實現
default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);V oldValue = get(key);// 傳入的函數入參是key和舊的value值V newValue = remappingFunction.apply(key, oldValue);if (newValue == null) {// 如果函數返回的新值為null,將移除keyif (oldValue != null || containsKey(key)) {// something to removeremove(key);return null;} else {// nothing to do. Leave things as they were.return null;}} else {// add or replace old mappingput(key, newValue);return newValue;}},簡單的來說就是將當前key的,key值和value值作為你的函數入參,根據個人定義的函數返回新的value值,若新的值為null則移除當前key,否則替換成新的值,并返回新值
2、computeIfAbsent()
1、使用
map.computeIfAbsent(2, k -> 2*k);表示key=2的值不存在,則設置2*k的值,如果key存在則不做任何修改
2、源碼
default V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction) {Objects.requireNonNull(mappingFunction);V v;if ((v = get(key)) == null) {V newValue;if ((newValue = mappingFunction.apply(key)) != null) {put(key, newValue);return newValue;}}return v;}這段代碼看起來就非常簡單 就是如果key存在則返回當前值;如果key不存在,獲取函數返回值,若返回值不為null,則設置為當前key的值,否則不做任何操作返回當前key的值
3、computeIfPresent()
從命名上看就知道,當key值存在的時候,則會進行一些操作,直接貼源碼
default V computeIfPresent(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);V oldValue;if ((oldValue = get(key)) != null) {V newValue = remappingFunction.apply(key, oldValue);if (newValue != null) {put(key, newValue);return newValue;} else {remove(key);return null;}} else {return null;}}當key存在的時候,將不為null的新值替換舊值,否則移除key
4、merge()
1、使用
Integer merge = map.merge(1, 2, (old, v) -> old + v);2、源碼
default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);Objects.requireNonNull(value);V oldValue = get(key);V newValue = (oldValue == null) ? value :remappingFunction.apply(oldValue, value);if(newValue == null) {remove(key);} else {put(key, newValue);}return newValue;}獲取當前key的值,如果不存在則使用value作為新的值,否則使用舊值和入參的value作為函數的參數獲取新的值,并替換當前值
5、接下來簡單介紹一下1.8之后Map添加的default方法
map新增的方法:
- getOrDefault
- forEach
- putIfAbsent
- compute
- computeIfAbsent
- computeIfPresent
- merge
- remove(key,value)
- replace
- replaceAll
getOrDefault
default V getOrDefault(Object key, V defaultValue) {V v;return (((v = get(key)) != null) || containsKey(key))? v: defaultValue; }如果Map中不存在該key,可以提供一個默認值,方法會返回改默認值。如果存在該key,返回鍵對應的值。
java8之前的寫法:
Map<String, String> map = new HashMap<>(); String value = "D"; if(map.containsKey("d")) {value = map.get("d"); }java8:
String value = map.getOrDefault("d", "D");forEach
default void forEach(BiConsumer<? super K, ? super V> action) {Objects.requireNonNull(action);for (Map.Entry<K, V> entry : entrySet()) {K k;V v;try {k = entry.getKey();v = entry.getValue();} catch(IllegalStateException ise) {// this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);}action.accept(k, v);} }forEach遍歷map,對map中的每個映射執行action指定的操作。
比如:
putIfAbsent
default V putIfAbsent(K key, V value) {V v = get(key);if (v == null) {v = put(key, value);}return v; }V putIfAbsent(K key, V value)只有在不存在key值的映射或者映射值為null,才將value值賦值給key。否則不做修改。該方法將條件判斷和賦值合二為一。
比如:
Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");String e = map.putIfAbsent("e", "E"); String b = map.putIfAbsent("b", "E"); System.out.println("返回e="+e); //返回e=null System.out.println("鍵e="+map.get("e"));//鍵e=E System.out.println("返回b="+b);//返回b=B System.out.println("鍵b="+map.get("b"));//鍵b=Bremove(key,value)
default boolean remove(Object key, Object value) {Object curValue = get(key);if (!Objects.equals(curValue, value) ||(curValue == null && !containsKey(key))) {return false;}remove(key);return true; }只有在當前Map中key映射的值等于value時才刪除該映射,否則什么也不做。
Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");map.remove("a", "B"); map.remove("b", "B"); System.out.println(map.get("a")); // A System.out.println(map.get("b")); // nullreplace(K key, V value)
default V replace(K key, V value) {V curValue;if (((curValue = get(key)) != null) || containsKey(key)) {curValue = put(key, value);}return curValue; }只有在當前Map中包含key,才用value去替換原來的值,否則什么也不做。
Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");map.replace("c", "1"); map.replace("b", "1"); System.out.println(map.get("c")); // null System.out.println(map.get("b")); // 1replace(K key, V oldValue, V newValue)
default boolean replace(K key, V oldValue, V newValue) {Object curValue = get(key);if (!Objects.equals(curValue, oldValue) ||(curValue == null && !containsKey(key))) {return false;}put(key, newValue);return true; }只有在當前Map中key的映射存在且映射的值等于oldValue時才用newValue去替換原來的值,否則什么也不做。
Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");map.replace("a", "1", "2"); map.replace("b", "B", "2"); System.out.println(map.get("a")); // A System.out.println(map.get("b")); // 2replaceAll
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {Objects.requireNonNull(function);for (Map.Entry<K, V> entry : entrySet()) {K k;V v;try {k = entry.getKey();v = entry.getValue();} catch(IllegalStateException ise) {// this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);}// ise thrown from function is not a cme.v = function.apply(k, v);try {entry.setValue(v);} catch(IllegalStateException ise) {// this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);}} }該方法簽名為replaceAll(BiFunction<? super K,? super V,? extends V> function),作用是對Map中的每個映射執行function指定的操作,并用function的執行結果替換原來的value
比如:
Map<String, String> map = new HashMap<>(); map.put("a", "A"); map.put("b", "B");map.replaceAll((k, v) -> v.toLowerCase()); map.forEach((k, v)-> {System.out.println(k + "=" + v); });// a=a // b=bmerge
default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);Objects.requireNonNull(value);V oldValue = get(key);V newValue = (oldValue == null) ? value :remappingFunction.apply(oldValue, value);if(newValue == null) {remove(key);} else {put(key, newValue);}return newValue; }value和remappingFunction不能為null
如果Map中key對應的映射不存在或者為null,則將value關聯到key上;否則執行remappingFunction,如果執行結果為null則刪除key的映射,否則用該結果跟key關聯。
比如:
Map<String, String> map = new HashMap<>(); map.put("e", "E"); map.merge("f", "F", String::concat); map.merge("e", "F", String::concat); System.out.println("map.get(\"f\")="+map.get("f")); // map.get("f")=F System.out.println("map.get(\"e\")="+map.get("e")); // map.get("e")=EFcompute
default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);// 獲取key對應的值V oldValue = get(key);//獲取新值V newValue = remappingFunction.apply(key, oldValue);// 如果新值為null,并且key存在,則刪除key;否則把新值賦值給keyif (newValue == null) {// delete mappingif (oldValue != null || containsKey(key)) {// something to removeremove(key);return null;} else {// nothing to do. Leave things as they were.return null;}} else {// add or replace old mappingput(key, newValue);return newValue;} }比如:
Map<String, String> map = new HashMap<>(); map.put("b", "B"); String val = map.compute("b", (k, v) -> null); String val2 = map.compute("c", (k, v) -> v + "+v"); System.out.println(val); // null System.out.println(val2); // null+vcomputeIfAbsent
default V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction) {Objects.requireNonNull(mappingFunction);V v;if ((v = get(key)) == null) {V newValue;if ((newValue = mappingFunction.apply(key)) != null) {put(key, newValue);return newValue;}}return v; }當Map中不存在key值的映射或映射值為null時,調用mappingFunction,并在mappingFunction執行結果非null時,將結果賦值給key。
比如(輸入每個字母的位置):
List<String> list = Lists.newArrayList("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g"); Map<String, List<Integer>> positionsMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) {positionsMap.computeIfAbsent(list.get(i), k -> Lists.newArrayListWithCapacity(1)).add(i); }System.out.println(positionsMap); // {a=[0], b=[1, 2], c=[3, 4, 5], d=[6, 7, 8], f=[9, 10], g=[11]}總結
以上是生活随笔為你收集整理的java8 Map新增方法的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直播回放 | 科技赋能零售金融业务转型
- 下一篇: Tomcat(二):server.xml