Java使用Lambda表达式多字段求和,通过多种应用场景举例,验证求和结果,进一步掌握 Lambda表达式 使用技巧。
目录
JDK1.8
依赖类
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
以下以电商中的商品举例……
01、创建测试类
GoodsInfoDTO实体类
package com.test.dto;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 商品基础信息DTO类
*
* @author 狂龙骄子
* @since 2022.05.01
*/
public class GoodsInfoDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String goodsNo;
private String goodsType;
private BigDecimal price;
private Integer qty;
public String getGoodsNo() {
return goodsNo;
}
public void setGoodsNo(String goodsNo) {
this.goodsNo = goodsNo;
}
public String getGoodsType() {
return goodsType;
}
public void setGoodsType(String goodsType) {
this.goodsType = goodsType;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getQty() {
return qty;
}
public void setQty(Integer qty) {
this.qty = qty;
}
}
02、求和验证
多种应用场景举例,验证求和结果
package com.test.app;
import java.math.BigDecimal;
import java.util.List;
import com.google.common.collect.Lists;
import com.test.dto.GoodsInfoDTO;
/**
* 临时测试类
*
* @author 狂龙骄子
* @since 2022.05.01
*/
public class Test20220501 {
/**
* 主函数
*/
public static void main(String[] args) {
List<GoodsInfoDTO> goodsInfoList = Lists.newArrayList();
GoodsInfoDTO goodsInfo = new GoodsInfoDTO();
goodsInfo.setGoodsNo("2022051001");
goodsInfo.setGoodsType("MATERIAL");
goodsInfo.setPrice(BigDecimal.valueOf(25.0));
goodsInfo.setQty(2);
goodsInfoList.add(goodsInfo);
goodsInfo = new GoodsInfoDTO();
goodsInfo.setGoodsNo("2022051002");
goodsInfo.setGoodsType("MATERIAL");
goodsInfo.setPrice(BigDecimal.valueOf(30));
goodsInfo.setQty(2);
goodsInfoList.add(goodsInfo);
goodsInfo = new GoodsInfoDTO();
goodsInfo.setGoodsNo("2022052001");
goodsInfo.setGoodsType("RECHARGE");
goodsInfo.setPrice(BigDecimal.valueOf(10.0));
goodsInfo.setQty(1);
goodsInfoList.add(goodsInfo);
// 汇总1:单列累加(65.0)
System.out.println(goodsInfoList.stream().map(GoodsInfoDTO::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
// 汇总2:先过滤再单列累加(55.0)
System.out.println(goodsInfoList.stream().filter(goods -> "MATERIAL".equals(goods.getGoodsType())).map(GoodsInfoDTO::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add));
// 汇总3:双列乘积并累加(120.0)
System.out.println(goodsInfoList.stream().map(x -> x.getPrice().multiply(BigDecimal.valueOf(x.getQty()))).reduce(BigDecimal.ZERO, BigDecimal::add));
// 积汇4:双列乘积并累加(120.0)
System.out.println(goodsInfoList.stream().reduce(BigDecimal.ZERO, (x, y) -> {
return x.add(y.getPrice().multiply(BigDecimal.valueOf(y.getQty())));
}, BigDecimal::add));
}
}
03、验证结果
通过练习,可以进一步掌握 Lambda表达式 使用技巧。
其中多字段求和的 汇总3 比 汇总4 更简洁、易理解。