• 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 }
    
     
  • 相关阅读:
    POJ 3258 二分答案
    Prototype 模式示例代码 (C++)
    offsetof 和 container_of
    二进制整数中的“1”
    Binary Tree Traversal Algorithms (二叉树遍历算法)
    A* Pathfinding Algorithm
    Axis­ Aligned 
Rectangles (Google 面试题, 2016网易游戏校招笔试)
    [LeetCode] Burst Ballons
    C++ 继承语义下构造函数中的对象指针
    kill-9和kill-15的区别
  • 原文地址:https://www.cnblogs.com/lshan/p/12936946.html
Copyright © 2020-2023  润新知