美文网首页程序员
对Map中的所有值进行自增/自减的一种优雅方式(JDK8)

对Map中的所有值进行自增/自减的一种优雅方式(JDK8)

作者: alonwang | 来源:发表于2018-11-14 08:52 被阅读46次

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

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

基础版本

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

    public static void main(String[] args) {
        Map<Integer, Integer> 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<Integer, Integer> map = new HashMap<>();
        map.forEach((key, value) -> map.merge(key, -1, Integer::sum));
    }
}

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

    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;
    }

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

最佳版本--replaceAll

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

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

总结

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

相关文章

  • 对Map中的所有值进行自增/自减的一种优雅方式(JDK8)

    2019-01-06 一种更优雅的方式 replaceAll() 需求: 对map中的所有值统一增减 基础版本 下...

  • 运算符

    自增、自减操作 b++对变量b进行了自增运算,变量的值加1,b++表达式的值不变, ++b对变量b进行了自增运算,...

  • java入门基础篇——java的运算符

    自减:- -自增:++ 功能:使变量的值增一或者减一 a++(a--):使用变量之后,在对变量进行+1(或者-1)...

  • java(4-运算符)

    自增自减运算符 前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算。后缀自增自减法(a+...

  • 第二课:Java运算符

    2.自增自减运算“++”、“--”。自增自减运算符放在前面,先对其进行“+1”操作后再计算。反之,则先进行计算后再...

  • javascript高级程序设计2

    3.5 操作符 1.自增自减操作符:前缀版自增自减 和 后缀版自增自减。 这两者的区别就在于前者的值在语句被求值...

  • Java运算符

    前缀自增自减法(++a,--a):先进行自增或者自减运算,再进行表达式运算。 后缀自增自减法(a++,a--):先...

  • java基础中自增与自减

    自增自减的作用是使变量的值增1,或者减1.自增与自减运算符是单目运算符,可以放在操作元之前,也可以是之后。放在操作...

  • C++中自增和自减的实现

    C++中自增和自减符号我们经常使用,了解它的实现方式能够更好的为自己定义的类实现自增和自减。我们首先需要了解一个知...

  • 11

    自增和自减 /*自增 ++- 通过自增可以使变量在自身的基础上增加1- 对...

网友评论

    本文标题:对Map中的所有值进行自增/自减的一种优雅方式(JDK8)

    本文链接:https://www.haomeiwen.com/subject/dpcdfqtx.html