• 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 }
    
     
  • 相关阅读:
    第23条:通过委托与数据源协议进行对象间通信
    第22条:理解NSCopying协议
    第21条:理解Objective-C错误模型
    第20条:为私有方法名加前缀
    《隐藏键盘》《隐藏PickerView控键》如果是xib中 点击空白处隐藏键盘
    《弹出提示》UIAlertView 弹出提示
    MAC 问题。
    小技巧
    控制器的生命周期
    问题。控制器跳转
  • 原文地址:https://www.cnblogs.com/lshan/p/12936946.html
Copyright © 2020-2023  润新知