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 结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...
随机推荐
- django查询优化及ajax编码格式下发送数据 总结
orm查询优化 1)only与refer only方法返回的是一个queryset对象,本质就是列表套数据对象 该对象内只含有only括号所指定的属性(其他属性也可以获取,但是需要重新走数据库 ...
- 浏览器表单自动填充默认样式 - autofill问题解决
这不知道是个什么神仙网站,解决办法写的这么清楚,页面有这么让人舒服 https://lhajh.github.io/css/chrome/2018/04/17/The-chrome-browser-f ...
- jquery selected选择器 语法
jquery selected选择器 语法 作用::selected 选择器选取被选择的 <option> 元素.直线电机生产厂家 语法:$(":selected") ...
- java 项目 文件关系 扫描 注释注入(2)
https://www.cnblogs.com/daimajun/p/7152970.html(copy) 先提一嘴 @RequestMapping(“url”),这里的 url写的是请求路径的一部分 ...
- 家庭问题x
[问题描述] 有n个人,编号为1,2,……n,另外还知道存在K个关系.一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员. 当n,k和k个关系给出之后,求出其中共有多少个家庭.最大的家庭 ...
- PHP-windows下IDEA配置网页地址
- Java内存和垃圾回收
Java内存大体上可以分为:本地方法区(线程共享).Java栈(线程隔离).本地方法栈(线程隔离).Java堆(线程共享).程序计数器(线程隔离). 1.本地方法区 各个线程共享的内存区域,只要存放被 ...
- Android学习_服务
一. 服务1. Android多线程 每一个Android应用程序都会分别运行在一个独立的Dalvik(或ART?)虚拟机中,而每个虚拟机在启动时会运行一个UI主线 ...
- css垂直居中布局总结
简介 总结记录一下经常需要用到垂直居中布局,欢迎补充(空手套...O(∩_∩)O) 以下栗子如果未特别标注同一使用这样的html结构 <div class="container&quo ...
- vue 打包部署到服务器上 配置nginx访问
坑一 css,js资源引入不正确 webpack配置文件config/index.js 需要更改: 方法一 当部署到带有文件夹的项目中,这种绝对路径就会出现问题,因为把配置的static文件夹当成了根 ...