文章目录
概述
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,则返回默认值,否则返回当前值