java按某属性分组并计算相关属性的和。
工作中在处理集合的时候会经常遇到需要分组然后计算某属性的和,在java8中,通过stream来操作集合,还是非常方便的,像过滤(filter)、分组(group)、获取单个属性的值,总而言之,简单方便。也有人不推荐使用,觉得写的太多,可读性会变差,主要看个人喜好吧。
下面主要是处理分组求和的代码
一个商品实体类,添加一些计算属性
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
/**
* @Auther: John.ma
* @Description: 商品类型
* @Date: 2019/5/17 13:51
*/
@Setter
@Getter
@ToString
@Accessors(chain = true)
public class Goods {
/** 商品类型 */
@ApiModelProperty(value = "商品类型")
private String goodsType;
/** 备件名称 */
@ApiModelProperty(value = "备件名称")
private String goodsName;
/** 供应商 */
@ApiModelProperty(value = "供应商")
private String supplier;
/** 一个月预测 */
@ApiModelProperty(value = "一个月预测")
private Integer oneMonthCount;
/** 三个月预测 */
@ApiModelProperty(value = "三个月预测")
private Integer threeMonthCount;
/** 半年预测 */
@ApiModelProperty(value = "半年预测")
private Integer sixMonthCount;
@ApiModelProperty(value = "数量")
private Integer count;
}
一个测试方法
public static void group() {
List<Goods> stockGoodsVOS = Lists.newArrayList();
Goods vo = new Goods();
Goods vo1 = new Goods();
Goods vo2 = new Goods();
Goods vo3 = new Goods();
vo.setGoodsType("a").setGoodsName("test").setSupplier("a").setOneMonthCount(10)
.setThreeMonthCount(20).setSixMonthCount(15).setCount(5);
vo1.setGoodsType("b").setGoodsName("testa").setSupplier("b").setOneMonthCount(5)
.setThreeMonthCount(5).setSixMonthCount(5).setCount(5);
vo2.setGoodsType("c").setGoodsName("testa").setSupplier("b").setOneMonthCount(1)
.setThreeMonthCount(1).setSixMonthCount(1).setCount(1);
vo3.setGoodsType("c").setGoodsName("testa").setSupplier("b").setOneMonthCount(1)
.setThreeMonthCount(1).setSixMonthCount(1).setCount(1);
stockGoodsVOS.add(vo);
stockGoodsVOS.add(vo1);
stockGoodsVOS.add(vo2);
stockGoodsVOS.add(vo3);
List<Goods> goodsVOS = Lists.newArrayList();
//主要代码
stockGoodsVOS.stream()
.collect(Collectors.groupingBy(Goods::getGoodsType))
.forEach((k, v) -> {
Optional<Goods> reduce = v.stream().reduce((v1, v2) -> {
v1.setOneMonthCount(BigDecimal.valueOf(v1.getOneMonthCount())
.add(BigDecimal.valueOf(v2.getOneMonthCount())).intValue());
v1.setThreeMonthCount(BigDecimal.valueOf(v1.getThreeMonthCount())
.add(BigDecimal.valueOf(v2.getThreeMonthCount())).intValue());
v1.setSixMonthCount(BigDecimal.valueOf(v1.getSixMonthCount())
.add(BigDecimal.valueOf(v2.getSixMonthCount())).intValue());
return v1;
});
goodsVOS.add(reduce.get());
});
goodsVOS.forEach(vos -> {
System.out.println(vos);
});
}
运行结果
小结
工作记录。
java按某属性分组并计算相关属性的和。的更多相关文章
- display属性的表格布局相关属性
基于CSS属性display:table的表格布局的使用 项目改造中遇到DIV+CSS实现的table,新需求需要在表格使用单元格合并,网上调查返现CSS display:table实现的tabl ...
- KnockoutJS 3.X API 第三章 计算监控属性(1) 使用计算监控属性
计算监控属性(Computed Observables) 如果你有一个监控属性firstName,和另一个lastName,你要显示的全名?可以使用计算监控属性来实现-它依赖于一个或多个其他监控属性, ...
- Java List对象集合按对象属性分组、分组汇总、过滤等操作示例
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Col ...
- css中的大小、定位、轮廓相关属性
css中的大小.定位.轮廓相关属性 1.通过height.width属性控制组件大小 height:高度,可以设置任何有效的距离值: width:宽度,可以设置任何有效的属性值: max-height ...
- KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册
计算监控属性构造参考 计算监控属性可使用以下形式进行构造: ko.computed( evaluator [, targetObject, options] ) - 这种形式是创建一个计算监控属性最常 ...
- Java并发包——线程安全的Map相关类
Java并发包——线程安全的Map相关类 摘要:本文主要学习了Java并发包下线程安全的Map相关的类. 部分内容来自以下博客: https://blog.csdn.net/bill_xiang_/a ...
- 【java规则引擎】基本语法和相关属性介绍
一个规则的语法信息 [1]条件部分(LSH部分)===>规则pattern之间的连接条件符号: (1)LHS 部分是由一个或多个条件组成,条件又称之为 pattern(匹配模式),多个 pa ...
- java web学习总结(二十六) -------------------JSP属性范围
所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14 结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...
随机推荐
- 51nod 1172 Partial Sums V2
题目 给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}.如果对生成的数组S再进行一次累加操作 ...
- 题解 【NOIP2010】关押罪犯
[NOIP2010]关押罪犯 Description S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突 ...
- shareSDK集成遇到的问题汇总
问题一.平台添加应用时需要输入的签名(下图)的获取方式 第一步.通过android studio生成签名保存在本地 第二步.查看签名的信息 问题二.由于同事集成了QQ登录和微信登录,后来又需要加入微博 ...
- C库函数-fgets()
函数声明:char *fgets(char *str,int n,FILE *stream) 函数介绍:从指定的stream流中读取一行,并把它存储在str所指向的字符串中.当读取到(n-1)个字符时 ...
- HttpClient : java.net.SocketException: Connection reset
1. 问题排查 httpclient : 4.5.5 排查过程 : 一次SocketException:Connection reset 异常排查 主要原因 : 调用 http 请求时发生了 Sock ...
- python接口自动化:python3.6中import Crypto.Hash报错的解决方案
一:问题 python3.6中算法加密引入包Crypto报错,即便安装了: pip install crypto pip install pycrypto pip install pycryptodo ...
- 【好书推荐】9、安卓Andorid编程吐血整理100+本
点开即可
- 安装指定版本的Ionic或Cordova
安装ionic 及 cordova npm install -g cordova ionic更新命令 npm update -g cordova ionic安装特定版本 npm install -g ...
- hotspot 线程状态
- NAT(地址转换技术)详解
目录 NAT产生背景ip地址基础知识NAT技术的工作原理和特点静态NAT动态NATNAT重载(经常应用到实际中)NAT技术的优缺点优点缺点NAT穿越技术应用层网关(ALG)ALG的实际应用NAT技术的 ...