zoukankan      html  css  js  c++  java
  • 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);
            });
        }
    

    运行结果

    小结

    工作记录。

  • 相关阅读:
    Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificat
    git快速生成配置sshkey
    快速合并多个git项目到同一目录
    一次性删除docker images中name为none的镜像
    mongo数据库数据库导入、导出
    python下ssh的简单实现
    python操作mysql
    Python的方法解析顺序(MRO)[转]
    python异常处理
    面向对象类成员
  • 原文地址:https://www.cnblogs.com/black-spike/p/10933698.html
Copyright © 2011-2022 走看看