最近遇到一个需求,需要统计各个会员的正在履行合同的合同租金总计,以此作为制定会员等级的标准。但是之前这个方法其实是有的,只是写的乱七八糟,具体的代码就不太方便放上来,就说说大致的代码思路吧。
原代码思路是先查询所有履行中合同,然后循环取出账单,使用HashMap的put方法,
将会员唯一标识作为key,判断无key先给map.put (memberId, BigDecimal.ZERO),
然后map.put(memberId, map.get(memberId).add(BigDecimal.ZERO));
有key则map.put(memberId, map.get(memberId).add(查询出的账单总额));
代码的业务问题就不说了,先看看这个累计的实现,这样其实是可以实现的,就是看起来不是很友好和简洁,既要写冗余的if判断,还让人读起来很费劲。
HashMap本身就提供了简洁的重复key的数据计算,或者采取steam的groupby都可以,这里因为偷懒,改的时候直接就直接用了HashMap的merge()方法,代码就可以这样:
map.merge(memberId, 查询出的账单总额, BigDecimal::add); 一行搞定,简洁明了,如果有不太熟悉这个方法了小伙伴,这里也可以简单介绍一下:
default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
//判断value和remappingFunction都不为空
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
//通过key去获取旧值 若无这个key则null
V oldValue = get(key);
//新值 = 旧值为null则新值=null,旧值不为null则新值= remappingFunction.apply(旧值, 新值);
V newValue = (oldValue == null) ? value :
remappingFunction.apply(oldValue, value);
//判断新值为null的话
if(newValue == null) {
//移除这个key
remove(key);
} else {
//不为null的话,重新put
put(key, newValue);
}
return newValue;
}
底层实现是这样的,该方法接收三个参数,一个 key 值,一个 value,一个 remappingFunction ,(remappingFunction :重新映射函数,用于重新计算值,得到newValue)如果给定的key不存在,它就变成了 put(key, value) 。如果 key 已经存在一些值,我们 remappingFunction 可以选择合并的方式,然后将合并得到的 newValue 赋值给原先的 key。
所以小伙伴们对于新特性和好用的方式方法可以多多了解,写起代码来就事半功倍啦。