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

}

上一篇:体验了一把websocket


下一篇:挖洞经验 | 利用跨站WebSocket劫持(CSWH)实现账户劫持