• 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);
            });
        }
    

    运行结果

    小结

    工作记录。

  • 相关阅读:
    刚听完CSDN总裁蒋涛先生的学术报告
    WinForm下屏幕截图程序的实现
    .NET4.5 Async 与 Async Targeting Pack区别
    WP8中的Tiles
    WP8中调用APP的方式
    安装Win8后必做的优化
    如何将项目从WP7升级到WP8
    ActiveWriter集成到VS.NET的NHibernate(ActiveRecord)对象可视化设计工具
    概述CSLA.NET 3.6 (Overview of CSLA .NET 3.6 for Windows and Silverlight)
    SQL Server BI Step by Step 1 准备
  • 原文地址:https://www.cnblogs.com/black-spike/p/10933698.html
Copyright © 2020-2023  润新知