引子
Map的数据操作,你是不是还只会put、get?
Map是我们日常编程中十分常用的数据接口,的在JDK8中,Map引入了几个新方法,可以简化我们对Map中数据的操作。
目前JDK的最新LTS版本已经更新到21了,这几个在JDK8引入的Map”新“方法其实也是”老“方法了,还没熟练使用也太out了,快来看看你都”学废“了吗?
getOrDefault
这个方法名很直观,见名知意:尝试获取key对应的值,如果未获取到,就返回默认值。
看一个使用的例子,新写法会比老写法更加简洁:
foreach
看方法名也可以知道,这个方法是遍历map的数据使用的。
如果没有foreach,我们遍历map的时候一般是使用增强for循环,有了这个方法后,可以更加方便使用entry中的key和val:
merge
从名字可以想到,是合并entry使用的,但是具体是怎么合并呢?
看一下日常最常用的Map实现类HashMap对merge方法的实现
代码比较长,但是实现的效果比较容易描述:这个方法接收3个参数:key、value、function。
- 如果key存在,将value按照function做1次计算后,更新到Map中
- 如果key不存在,将key-value放入Map中
这个方法在某些场景中挺好用的,代码简洁易懂,例如:我们有1个List,要统计List中每个元素出现的次数。我们要实现的逻辑是,遍历List中的每个元素,如果这个元素在Map中存在,Map中的值+1;如果不存在,则放入Map中,次数(值)为1。
可以看到我们使用merge方法的话,只用1行就简洁实现了这个逻辑。
putIfAbsent
也是一个见名知意的方法:不存在key或者值为null时,才将键值对放入Map。跟put方法相比,这个方法不会直接覆盖已有的值,在不允许覆盖旧值的场景使用起来会比较简洁。
computer
computer方法需要传入2个参数:key、function。主要有3步操作
- 获取到key对应的oldValue,可能为null
- 经过function计算获取newValue
- put(key, newValue)
还是以刚刚统计单次次数需求为例,看一下computer的写法:
computeIfAbsent
看名字就知道是compute方法衍生出来的方法,这个方法只在key不存在的时候,执行computer计算,如果说key对应的value存在,就直接返回这个value。
例如,我们需要计算斐波那锲数列的时候,可以使用这个方法来简化代码:
computeIfPresent
这个是computeIfAbsent的姊妹方法,区别在于,这个方法是只有key存在的时候,才去执行computer计算和值的更新。
replace
这个方法的效果是:
- 如果key存在,则更新值
- 如果key不存在,什么也不做