工作中在处理集合的时候会经常遇到需要分组然后计算某属性的和,在java8中,通过stream来操作集合,还是非常方便的,像过滤(filter)、分组(group)、获取单个属性的值,总而言之,简单方便。也有人不推荐使用,觉得写的太多,可读性会变差,主要看个人喜好吧。

下面主要是处理分组求和的代码

一个商品实体类,添加一些计算属性

  1. import io.swagger.annotations.ApiModelProperty;
  2. import lombok.Getter;
  3. import lombok.Setter;
  4. import lombok.ToString;
  5. import lombok.experimental.Accessors;
  6. /**
  7. * @Auther: John.ma
  8. * @Description: 商品类型
  9. * @Date: 2019/5/17 13:51
  10. */
  11. @Setter
  12. @Getter
  13. @ToString
  14. @Accessors(chain = true)
  15. public class Goods {
  16. /** 商品类型 */
  17. @ApiModelProperty(value = "商品类型")
  18. private String goodsType;
  19. /** 备件名称 */
  20. @ApiModelProperty(value = "备件名称")
  21. private String goodsName;
  22. /** 供应商 */
  23. @ApiModelProperty(value = "供应商")
  24. private String supplier;
  25. /** 一个月预测 */
  26. @ApiModelProperty(value = "一个月预测")
  27. private Integer oneMonthCount;
  28. /** 三个月预测 */
  29. @ApiModelProperty(value = "三个月预测")
  30. private Integer threeMonthCount;
  31. /** 半年预测 */
  32. @ApiModelProperty(value = "半年预测")
  33. private Integer sixMonthCount;
  34. @ApiModelProperty(value = "数量")
  35. private Integer count;
  36. }

一个测试方法

  1. public static void group() {
  2. List<Goods> stockGoodsVOS = Lists.newArrayList();
  3. Goods vo = new Goods();
  4. Goods vo1 = new Goods();
  5. Goods vo2 = new Goods();
  6. Goods vo3 = new Goods();
  7. vo.setGoodsType("a").setGoodsName("test").setSupplier("a").setOneMonthCount(10)
  8. .setThreeMonthCount(20).setSixMonthCount(15).setCount(5);
  9. vo1.setGoodsType("b").setGoodsName("testa").setSupplier("b").setOneMonthCount(5)
  10. .setThreeMonthCount(5).setSixMonthCount(5).setCount(5);
  11. vo2.setGoodsType("c").setGoodsName("testa").setSupplier("b").setOneMonthCount(1)
  12. .setThreeMonthCount(1).setSixMonthCount(1).setCount(1);
  13. vo3.setGoodsType("c").setGoodsName("testa").setSupplier("b").setOneMonthCount(1)
  14. .setThreeMonthCount(1).setSixMonthCount(1).setCount(1);
  15. stockGoodsVOS.add(vo);
  16. stockGoodsVOS.add(vo1);
  17. stockGoodsVOS.add(vo2);
  18. stockGoodsVOS.add(vo3);
  19. List<Goods> goodsVOS = Lists.newArrayList();
  20. //主要代码
  21. stockGoodsVOS.stream()
  22. .collect(Collectors.groupingBy(Goods::getGoodsType))
  23. .forEach((k, v) -> {
  24. Optional<Goods> reduce = v.stream().reduce((v1, v2) -> {
  25. v1.setOneMonthCount(BigDecimal.valueOf(v1.getOneMonthCount())
  26. .add(BigDecimal.valueOf(v2.getOneMonthCount())).intValue());
  27. v1.setThreeMonthCount(BigDecimal.valueOf(v1.getThreeMonthCount())
  28. .add(BigDecimal.valueOf(v2.getThreeMonthCount())).intValue());
  29. v1.setSixMonthCount(BigDecimal.valueOf(v1.getSixMonthCount())
  30. .add(BigDecimal.valueOf(v2.getSixMonthCount())).intValue());
  31. return v1;
  32. });
  33. goodsVOS.add(reduce.get());
  34. });
  35. goodsVOS.forEach(vos -> {
  36. System.out.println(vos);
  37. });
  38. }

运行结果

小结

工作记录。

java按某属性分组并计算相关属性的和。的更多相关文章

  1. display属性的表格布局相关属性

    基于CSS属性display:table的表格布局的使用   项目改造中遇到DIV+CSS实现的table,新需求需要在表格使用单元格合并,网上调查返现CSS display:table实现的tabl ...

  2. KnockoutJS 3.X API 第三章 计算监控属性(1) 使用计算监控属性

    计算监控属性(Computed Observables) 如果你有一个监控属性firstName,和另一个lastName,你要显示的全名?可以使用计算监控属性来实现-它依赖于一个或多个其他监控属性, ...

  3. Java List对象集合按对象属性分组、分组汇总、过滤等操作示例

    import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Col ...

  4. css中的大小、定位、轮廓相关属性

    css中的大小.定位.轮廓相关属性 1.通过height.width属性控制组件大小 height:高度,可以设置任何有效的距离值: width:宽度,可以设置任何有效的属性值: max-height ...

  5. KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册

    计算监控属性构造参考 计算监控属性可使用以下形式进行构造: ko.computed( evaluator [, targetObject, options] ) - 这种形式是创建一个计算监控属性最常 ...

  6. Java并发包——线程安全的Map相关类

    Java并发包——线程安全的Map相关类 摘要:本文主要学习了Java并发包下线程安全的Map相关的类. 部分内容来自以下博客: https://blog.csdn.net/bill_xiang_/a ...

  7. 【java规则引擎】基本语法和相关属性介绍

    一个规则的语法信息 [1]条件部分(LSH部分)===>规则pattern之间的连接条件符号:   (1)LHS 部分是由一个或多个条件组成,条件又称之为 pattern(匹配模式),多个 pa ...

  8. java web学习总结(二十六) -------------------JSP属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (18) -----第三章 查询之结果集扁平化和多属性分组

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-14  结果集扁平化 问题 你有一对多关联的两个实体,你想通过一个查询,获取关联 ...

随机推荐

  1. Codeforces Round #451 (Div. 2) [ D. Alarm Clock ] [ E. Squares and not squares ] [ F. Restoring the Expression ]

    PROBLEM D. Alarm Clock 题 OvO http://codeforces.com/contest/898/problem/D codeforces 898d 解 从前往后枚举,放进 ...

  2. learning armbian steps(10) ----- armbian 源码分析(五)

    在上一节的分析当中,已经知道了uboot kernel的源代码路径及编译选项,以及rootfs的版本,相关信息如下所示: ## BUILD CONFIGURATION Build target: Bo ...

  3. P2015 二叉苹果树,树形dp

    P2015 二叉苹果树 题目大意:有一棵二叉树性质的苹果树,每一根树枝上都有着一些苹果,现在要去掉一些树枝,只留下q根树枝,要求保留最多的苹果数(去掉树枝后不一定是二叉树) 思路:一开始就很直接的想到 ...

  4. win7系统扩展双屏幕时,开启两个屏幕下都显示任务栏,第三方插件

    Dual Monitor Taskbar 下载软件 下载地址 https://dual-monitor-taskbar.en.softonic.com/ 安装即可

  5. 使用Python画一朵玫瑰花

    # -*- coding: utf-8 -*- # @Time : 18-9-14 下午12:47 # @Author : Felix Wang from turtle import * import ...

  6. docker之CPU配额参数的混合使用

    在启动容器的时候有很多参数,这里来实践一下与CPU相关的参数. 实例: 创建两个容器,docker10.docker20,让两个容器只运行在CPU0上,然后测试CPU使用率. [root@openst ...

  7. require.context

    带表达式的 require 语句 如果你的 require参数含有表达式(expressions),会创建一个上下文(context),因为在编译时(compile time)并不清楚具体是哪一个模块 ...

  8. AJAX-基础-1

    概述 AJAX = Asynchronous JavaScript And XML(异步 JavaScript 及 XML) AJAX 是 Asynchronous JavaScript And XM ...

  9. Java读取根据HTML模板生成HTML页面

    首先,我们需要一个html模板: <html> <head> <title>###title###</title> <meta http-equi ...

  10. linux如何模糊查找一个文件

    在当前目录下搜索指定文件: find . -name test.txt 在当前目录下模糊搜索文件: find . -name '*.txt' 在当前目录下搜索特定属性的文件: find . -amin ...