java8 Map新增方法的使用

本文详细介绍了Java8中Map接口新增的`compute()`, `computeIfAbsent()`, `computeIfPresent()`, `merge()`等方法的使用及源码解析,通过实例展示了这些面向函数式编程的方法如何在Map操作中实现条件更新、合并等功能。" 79140254,7414802,Linux find命令详解:实时精确查找文件,"['Linux系统', '文件管理', '命令行工具']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

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方法
  1. default V replace(K key, V value):key存在且value值不为null,则替换,并返回旧值
  2. default boolean replace(K key, V oldValue, V newValue):类似于CAS,如果key存在且value值不为null且value值等于预期的oldValue,则替换,否则返回false
  3. default boolean remove(Object key, Object value):当前key存在且其value值不为null并且入参value等于其当前值,则移除key 否则返回false
  4. default V putIfAbsent(K key, V value):如其名,key不存在或当前值为null,则给put,并返回旧值
  5. default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function):根据函数返回值,替换所有key的value值
  6. default void forEach(BiConsumer<? super K, ? super V> action):遍历
  7. default V getOrDefault(Object key, V defaultValue):key不存在或值为null,则返回默认值,否则返回当前值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值