ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Stream sorted排序案例

2021-05-28 13:00:22  阅读:367  来源: 互联网

标签:BigDecimal Stream tradeList new Trade import sorted 排序


package com.gblfy.gxts;

import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Before;
import org.junit.Test;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 案例5:
 * 在股票中,撮合交易的原则是一点时间内的交易申请,价格越高的先成交;
 * 价格一样,下单时间最早的先成交;价格和时间一致,交易量大的先成交;
 * 如果价格、时间、交易量都一致,机构先成交,散户最后成交。
 * 现有一批交易申请数据,需要确认交易先后顺序。
 */
public class CaseFive {

    /**
     * 交易实体模型
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    class Trade {

        /**
         * 下单价格
         */
        private BigDecimal price;

        /**
         * 下单时间
         */
        private LocalDateTime time;
        /**
         * 下单量
         */
        private Integer count;
        /**
         * 下单类型: 机构 / 个人
         */
        private String type;
    }

    /**
     * 一段时间内的交易申请
     */
    List<Trade> tradeList;

    //初始化顺序
    @Before
    public void init() {
        tradeList = new ArrayList<>();

        tradeList.add(new Trade(new BigDecimal(100),
                LocalDateTime.now().plusSeconds(1),
                500, "机构"));

        tradeList.add(new Trade(new BigDecimal(101),
                LocalDateTime.now().plusSeconds(2),
                1, "个人"));

        tradeList.add(new Trade(new BigDecimal(101),
                LocalDateTime.now().plusSeconds(1),
                1, "个人"));

        tradeList.add(new Trade(new BigDecimal(100),
                LocalDateTime.now().plusSeconds(1),
                500, "个人"));

        tradeList.add(new Trade(new BigDecimal(100),
                LocalDateTime.now().plusSeconds(0),
                2, "个人"));

        tradeList.add(new Trade(new BigDecimal(100),
                LocalDateTime.now().plusSeconds(0),
                100, "机构"));
    }

    /**
     * 对交易信息排序后的列表
     */
    @Test
    public void sortTrade() {

        System.out.println(JSON.toJSONString(tradeList, true));
        List<Trade> tradeResulltList = tradeList.stream()
                .sorted(Comparator
                        //首先按照价格排序
                        .comparing(Trade::getPrice,
                                //TODO 进行排序调整,将自然排序翻转
                                Comparator.reverseOrder())
                        //按照交易时间,自然排序
                        .thenComparing(Trade::getTime)
                        //交易量排序,自然排序翻转
                        .thenComparing(Trade::getCount,
                                //TODO 进行排序调整,将自然排序翻转
                                Comparator.reverseOrder())
                        //自定义排序规则
                        .thenComparing(
                                //要排序的字段值
                                Trade::getType,
                                //自定义排序规则
                                (type1, type2) -> {
                                    if ("机构".equals(type1) && "个人".equals(type1)) {
                                        //-1:type1在先, type2在后
                                        return -1;
                                    } else if ("个人".equals(type1) && "机构".equals(type2)) {
                                        //1:type2在先, type1在后
                                        return 1;
                                    } else {
                                        //0:不分先后
                                        return 0;
                                    }
                                }
                        )
                ).collect(Collectors.toList());
        System.out.println("排序后的结果:" + JSON.toJSONString(tradeResulltList, true));
    }

}

标签:BigDecimal,Stream,tradeList,new,Trade,import,sorted,排序
来源: https://blog.csdn.net/weixin_40816738/article/details/117358872

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有