文章目錄
概述
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,將移除key
if (oldValue != null || containsKey(key)) {
// something to remove
remove(key);
return null;
} else {
// nothing to do. Leave things as they were.
return null;
}
} else {
// add or replace old mapping
put(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方法
- default V replace(K key, V value):key存在且value值不爲null,則替換,並返回舊值
- default boolean replace(K key, V oldValue, V newValue):類似於CAS,如果key存在且value值不爲null且value值等於預期的oldValue,則替換,否則返回false
- default boolean remove(Object key, Object value):當前key存在且其value值不爲null並且入參value等於其當前值,則移除key 否則返回false
- default V putIfAbsent(K key, V value):如其名,key不存在或當前值爲null,則給put,並返回舊值
- default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function):根據函數返回值,替換所有key的value值
- default void forEach(BiConsumer<? super K, ? super V> action):遍歷
- default V getOrDefault(Object key, V defaultValue):key不存在或值爲null,則返回默認值,否則返回當前值