zoukankan      html  css  js  c++  java
  • Map的merge方法(java8)

    参考原文 :https://www.jianshu.com/p/292f4e346b5d

    背景介绍

    merge()可以解释如下:它将新的值赋值给到key中(如果不存在)或更新具有给定值的现有key(UPSERT)。让我们从最基本的例子开始:计算唯一的单词出现次数。在java8之前的时候,代码非常混乱,实际的实现其实已经失去了本质层面的设计意义。

    var map = new HashMap<String, Integer>();
    words.forEach(word -> {
        var prev = map.get(word);
        if (prev == null) {
            map.put(word, 1);
        } else {
            map.put(word, prev + 1);
        }
    });

    按照上述代码的逻辑,假设给定一个输入集合,输出的结果如下;

    var words = List.of("Foo", "Bar", "Foo", "Buzz", "Foo", "Buzz", "Fizz", "Fizz");
    //...
    {Bar=1, Fizz=2, Foo=3, Buzz=2}

    场景:

    例子:举一个例子。你有一个帐户操作类

    class Operation {
        private final String accNo;
        private final BigDecimal amount;
    }

    以及针对不同帐户的一系列操作:

    operations = List.of(
        new Operation("123", new BigDecimal("10")),
        new Operation("456", new BigDecimal("1200")),
        new Operation("123", new BigDecimal("-4")),
        new Operation("123", new BigDecimal("8")),
        new Operation("456", new BigDecimal("800")),
        new Operation("456", new BigDecimal("-1500")),
        new Operation("123", new BigDecimal("2")),
        new Operation("123", new BigDecimal("-6.5")),
        new Operation("456", new BigDecimal("-600"))
    );

    我们希望为每个帐户计算余额(总运营金额)。假如不用merge(),就变得非常麻烦了:

    Map balances = new HashMap<String, BigDecimal>();
    operations.forEach(op -> {
        var key = op.getAccNo();
        balances.putIfAbsent(key, BigDecimal.ZERO);
        balances.computeIfPresent(key, (accNo, prev) -> prev.add(op.getAmount()));
    });

    使用merge之后的代码

    operations.forEach(op ->
            balances.merge(op.getAccNo(), op.getAmount(), 
                    (soFar, amount) -> soFar.add(amount))
    );

    再进行优化的逻辑。

    operations.forEach(op ->
            balances.merge(op.getAccNo(), op.getAmount(), BigDecimal::add)
    );

    当然结果是正确的,这样简洁的代码心动吗?对于每个操作,add在给定的amount给定accNo

    { 123 = 9.5,456 = - 100 }
    
     
  • 相关阅读:
    Zend Framework 项目 index.php 的问题
    《MySQL 必知必会》读书总结
    phpstorm 无法格式化代码
    Windows 下 zip 版的 MySQL 的安装
    配置Windows下的PHP开发环境
    phpstorm 激活服务器
    《DOM Scripting》
    《JavaScript高级程序设计》
    sql 查找所有已经分配部门的员工
    sql 表的连接 inner join、full join、left join、right join、natural join
  • 原文地址:https://www.cnblogs.com/lshan/p/12936946.html
Copyright © 2011-2022 走看看