• Java8 根据List实体中一个字段去重取最大值,并且根据该字段进行排序


    1、前言

    某个功能要求需要对一个list对象里数据按照股票分组,并且取分组涨跌幅最大的,返回一个新的list对象,并且按照涨跌幅字段进行排序,这么一连串的要求,如果按照传统的写法,我们需要写一大坨的代码,代码很是啰嗦,我们可以选择使用java8中的Collectors.groupingByCollectors.maxBy 来按照某个字段先进行分组,在取分组中某个最大值,最后收集到一个列表中。话不多说,上代码!
    2、主要内容

    实体

    @Builder
    @Data
    @ApiModel("个股行情")
    public class StockHq implements Serializable {
        private static final long serialVersionUID = 5061852660593543033L;
        /**
         * 表id
         */
        @ApiModelProperty("表id")
        @TableId(value = "id", type = IdType.AUTO)
        private Long id;
        /**
         * 交易日期
         */
        @ApiModelProperty("交易日期 ")
        @TableField("trade_date")
        private Integer tradeDate;
        /**
         * 证券id
         */
        @ApiModelProperty("证券id")
        @TableField("stock_id")
        private Integer stockId;
        /**
         * 股票代码
         */
        @ApiModelProperty("交易日期  ")
        @TableField("stock_code")
        private String stockCode;
        /**
         * 股票名称
         */
        @ApiModelProperty("股票名称")
        @TableField("stock_name")
        private String stockName;
        
        @ApiModelProperty("上榜日涨幅")
        @TableField("price_chg")
        private BigDecimal priceChg;
        
        @ApiModelProperty("收盘价")
        @TableField("price_now")
        private BigDecimal priceNow;
    
        @ApiModelProperty("成交数量")
        @TableField("trade_amount")
        private Integer tradeAmount;
        
        @NumberField(type = 1)
        @ApiModelProperty("成交金额")
        @TableField("trade_money")
        private BigDecimal tradeMoney;
    }
    

    使用collect方法,结合collect中的Collectors.groupingByCollectors.maxBy

          List stockHqList = new ArrayList<>();
          
            stockHqList.add(StockHq.builder().stockCode("603386").stockId(100603386).stockName("骏亚科技").priceChg(new BigDecimal("10.3")).tradeDate(20200101).build());
            stockHqList.add(StockHq.builder().stockCode("603386").stockId(100603386).stockName("骏亚科技").priceChg(new BigDecimal("9.3")).tradeDate(20200111).build());
            stockHqList.add(StockHq.builder().stockCode("000737").stockId(200000737).stockName("北方铜业").priceChg(new BigDecimal("1.3")).tradeDate(20240711).build());
            stockHqList.add(StockHq.builder().stockCode("000737").stockId(200000737).stockName("北方铜业").priceChg(new BigDecimal("134.2")).tradeDate(20240611).build());
    
    				
            List lastStockHqList = stockHqList.stream()
                    .collect(Collectors.groupingBy(StockHq::getStockCode, Collectors.maxBy(Comparator.comparing(StockHq::getPriceChg))))
                    .values()
                    .stream()
                    .map(Optional::get)
                    .sorted(Comparator.comparing(StockHq::getPriceChg).reversed())//降序
                    .collect(Collectors.toList());//返回一个list
    

    代码就用一行,代码简单名了,特此写文章作为笔记,希望能对你有所帮助。

  • 相关阅读:
    并发内存池(C++)
    小米miui全机型代码对照与各机型发布时间表 了解小米机型发展历程
    中国软冰淇淋市场预测与投资前景研究报告(2022版)
    jenkins 安装以及自动构建maven项目并且运行
    分享一个500页面给大家
    30岁测试开发年薪不足80万,还要被面试官diss混得太差?
    Elasticsearch:使用反向地理编码在地图上显示自定义区域统计数据
    uniapp开发短视频系统仿哔哩哔哩
    uniapp公用返回组件
    【排序】详解冒泡排序
  • 原文地址:https://blog.csdn.net/CharlesYooSky/article/details/140438573