博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
map中value统一自增或自减的优雅写法
阅读量:6079 次
发布时间:2019-06-20

本文共 1443 字,大约阅读时间需要 4 分钟。

2019-01-06 一种更优雅的方式 replaceAll()

需求: 对map中的所有值统一增减

基础版本

下面这个方式是可行的,但是看着不太优雅

public static void main(String[] args) {        Map
map = new HashMap<>(); map.forEach((key, value)->map.put(key,map.get(key)-1)); }复制代码

误用版本--merge 有副作用

经过一番研究之后发现了一种简单的方式,但是有个限制 merge之后不能发生结构性修改(也就是map中元素数量不能发生变化),在当前场景下只要保证merge后不为空值即可

public class MapIncr {    public static void main(String[] args) {        Map
map = new HashMap<>(); map.forEach((key, value) -> map.merge(key, -1, Integer::sum)); }}复制代码

关键就是map.merge(),源码如下

default V merge(K key, V value,            BiFunction
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; }复制代码

可以看到如果新值为空就会被移除掉

最佳版本--replaceAll

replaceAll会对map中的所有元素使用传递进来的BiFunction进行更新.

public class MapIncr {    public static void main(String[] args) {        Map
map = new HashMap<>(); map.replaceAll((k,v)->v+1); }}复制代码

总结

  • 基础版本的偏向于命令式编程,遍历map,对map中的每个元素进行处理,处理规则是,这需要使用者说明并编写整个处理流程.
  • 最佳版本则更符合函数式编程,我想替换map中的所有值,替换规则是xxx,隐藏了遍历逻辑.很明显,最佳版本的更加清楚明了.
  • 至于误用版本,就是对api的错误使用了,之所以保留它,只是想说明: keep digging,there is always a better way,

转载地址:http://oehgx.baihongyu.com/

你可能感兴趣的文章
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>