标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。