Java8 根据List实体中一个字段去重取最大值,并且根据该字段进行排序
1、前言
(图片来源网络,侵删)
某个功能要求需要对一个list对象里数据按照股票分组,并且取分组涨跌幅最大的,返回一个新的list对象,并且按照涨跌幅字段进行排序,这么一连串的要求,如果按照传统的写法,我们需要写一大坨的代码,代码很是啰嗦,我们可以选择使用java8中的Collectors.groupingBy和Collectors.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.groupingBy和Collectors.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
代码就用一行,代码简单名了,特此写文章作为笔记,希望能对你有所帮助。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。