首页 > 编程语言 >Java8中Map函数应用

Java8中Map函数应用

时间:2023-01-18 10:34:57浏览次数:46  
标签:Map 函数 map Java8 amountByTypeMap amount payments payment

  • computeIfAbsent函数

computeIfAbsent方法的逻辑是,如果map中没有(Absent)相应的key,则执行lambda表达式生成一个默认值并放入map中并返回,否则返回map中已有的值。

List<Payment> payments = getPayments();
Map<Integer, List<Payment>> paymentByTypeMap = new HashMap<>();
for(Payment payment : payments){
    paymentByTypeMap.computeIfAbsent(payment.getPayTypeId(), k -> new ArrayList<>())
            .add(payment);
}
  • computeIfPresent函数

computeIfPresent函数与computeIfAbcent的逻辑是相反的,如果map中存在(Present)相应的key,则对其value执行lambda表达式生成一个新值并放入map中并返回,否则返回null。

    List<Payment> payments = getPayments();
    //将payment关联到相关的order上
    for(Payment payment : payments){
        orderPaymentMap.computeIfPresent(payment.getOrderId(),
                (k, orderPayment) -> orderPayment.addPayment(payment));
    }
  • compute函数

compute函数,其实和computeIfPresent、computeIfAbcent函数是类似的,不过它不关心map中到底有没有值,都执行lambda表达式计算新值并放入map中并返回。
这个函数适合做分组迭代计算,像分组汇总金额的情况,就适合使用compute函数,如下:

List<Payment> payments = getPayments();
Map<Integer, BigDecimal> amountByTypeMap = new HashMap<>();
for(Payment payment : payments){
    amountByTypeMap.compute(payment.getPayTypeId(), 
            (key, oldVal) -> oldVal == null ? payment.getAmount() : oldVal.add(payment.getAmount())
    );
}

当oldValue是null,表示map中第一次计算相应key的值,直接给amount就好,而后面再次累积计算时,直接通过add函数汇总就好。

  • merge函数

merge的第一个参数是key,第二个参数是value,第三个参数是值合并函数。
当是第一次计算相应key的值时,直接放入value到map中,后面再次计算时,使用值合并函数BigDecimal::add计算出新的汇总值,并放入map中即可。

List<Payment> payments = getPayments();
Map<Integer, BigDecimal> amountByTypeMap = new HashMap<>();
for(Payment payment : payments){
    amountByTypeMap.merge(payment.getPayTypeId(), payment.getAmount(), BigDecimal::add);
}
  • forEach函数

# 经典循环法:
for(Map.Entry<String, BigDecimal> entry: amountByTypeMap.entrySet()){
    Integer payTypeId = entry.getKey();
    BigDecimal amount = entry.getValue();
    System.out.printf("payTypeId: %s, amount: %s \n", payTypeId, amount);
}
# 用forEach
amountByTypeMap.forEach((payTypeId, amount) -> {
    System.out.printf("payTypeId: %s, amount: %s \n", payTypeId, amount);
});

标签:Map,函数,map,Java8,amountByTypeMap,amount,payments,payment
From: https://www.cnblogs.com/zlnp/p/17059311.html

相关文章

  • 为什么梯度方向是函数值增大最快的方向
    ​​WelcomeToMyBlog​​​梯度下降中,梯度反方向是函数值下降最快的方向,说明梯度方向是函数值上升最快的方向.下面给出说明,基础好的可以直接看最后一部分:沿梯度......
  • 只需两步便可生成 51 单片机最精准的延时函数
    前言我们在学习51单片机的过程中会用到延时,比如一个简单的流水灯就需要延时来控制依次点亮的时间,或者一些模块在单片机发出读数据指令后,需要延时几十微秒才可以读出数据......
  • python方法(函数)
    定义格式def方法名(参数1,参数2,参数3):#具体实现return#返回值参数默认值defdesc(name='no-name',age=0):print("%s%d"%(name,age))#调用desc......
  • 使用Hook拦截sendto函数解决虚拟局域网部分游戏联机找不到房间的问题——以文明6为例
    正文本文代码及编译好的二进制文件可以在下面这个仓库找到。https://gitcode.net/PeaZomboss/miscellaneous源代码在文件夹230113-civ6hooksendto若要下载二进制,请到ht......
  • 04. 函数
    一、什么是函数  函数就是可以作为一个逻辑单元对待的一组JS代码。使用函数可以使代码更加简洁,提高重用性。如果一段具有特定功能的程序代码需要在程序中多次使用,就可......
  • Python中reshape函数(-1表示什么)
    https://blog.sciencenet.cn/blog-3428464-1247194.html reshape函数(-1表示什么)1.当原始数组A[4,6]为二维数组,代表4行6列。A.reshape(-1,8):表示将数组转换成8列的数组......
  • Constructor注入和Map示例
    Constructor注入和Map示例在此示例中,我们使用 map 作为具有已发布用户名答案的答案。在这里,我们将键和值对都用作字符串。像前面的示例一样,它是论坛的示例,其中 一个问......
  • 具有依赖对象的构造函数注入
    如果类之间存在HAS-A关系,则首先创建依赖对象(包含对象)的实例,然后将其作为主类构造函数的参数传递。在这里,我们的场景是员工HAS-A地址。Address类对象将称为从属对象。首......
  • C标准库 | 字符串转整数/浮点数函数汇总
    在日常LinuxC语言开发中,不可避免会用到字符串转整数或者浮点数的操作,例如带参数的​​main​​​函数中,在​​shell​​下对着某个命令输入一组数字参数,这组数字实际上是字......
  • C标准库 | 内存分配以及释放函数汇总
    在日常C语言使用过程中,不可避免遇到从堆中申请空间给特定的数据结构(结构体指针)!一、头文件#include<stdlib.h>文件所在路径:$ls/usr/include/stdlib.h二、函数声明/*Alloc......