利⽤Java8list.stream().sorted解决不同状态的⾃定义排序规则
⽂字描述:
三个状态applyStatusDesc(申请状态),repaymentStatus( 0 未还 1已还), overStatus( 逾期状态 0:未逾期,1:已逾期)。
当applyStatusDesc为:“待确认”,“待审核”,“待发送”,“待放款”,按照:“待确认”,“待审核”,“待发送”,"待放款"顺序排序,如果数据为相同状态,则按createTime排序。⽐如:有多条applyStatusDesc=待确认的数据,就按createTime排序。
当applyStatusDesc为已放款时排在"待确认",“待审核”,“待发送”,"待放款"的最后 ,按照repaymentStatus和 overStatus的状态(repaymentStatus=0 overStatu=1,repaymentStatus=0 overStatu=0,repaymentStatus=1)顺序排序 ,状态相同按createTime排序。
⽅法有很多,我利⽤的是Java8 list.stream().sortedjava stream
ObjectTest实体:
private String applyStatusDesc;//放款状态:0 待确认,1 待审核, 11 待放款,2 已放款,30:已取消,31:已拒绝
private Integer repaymentStatus;//还款状态:0 未结清 1已结清
private Integer overStatus;//逾期状态 0:未逾期,1:已逾期
private String createDate;
public ObjTest(String as, Integer rs, Integer os, String ceDate) {
this.applyStatusDesc=as;
this.overStatus=os;
}
@Test
public void selectMcCSMInfoTest(){
List<ObjTest> list = Arrays.asList(
new ObjTest("待审核",null,null,"2019-1-4" ),
new ObjTest("已放款",0,0,"2019-1-8" ),
new ObjTest("待发送",null,null,"2019-1-5" ),
new ObjTest("待放款",null,null,"2019-1-6" ),
new ObjTest("已放款",0,1,"2019-1-7" ),
new ObjTest("已放款",0,1,"2019-1-7" ),
new ObjTest("已放款",0,0,"2019-1-8" ),
new ObjTest("已放款",1,0,"2019-1-2" ),
new ObjTest("待确认",null,null,"2019-1-1" ),
new ObjTest("待确认",null,null,"2019-1-2" ),
new ObjTest("待确认",null,null,"2019-1-1" ),
new ObjTest("待确认",null,null,"2019-1-2" ),
new ObjTest("待审核",null,null,"2019-1-3" ),
new ObjTest("已放款",1,0,"2019-1-2" ),
new ObjTest("已放款",0,0,"2019-1-2" )
);
List<ObjTest> objTestList = new LinkedList<>(); //⽤来存放新的排好序的数据
//排序规则
List<String> sortList =  Arrays.asList("待确认","待审核","待发送","待放款","已放款");
list.stream().sorted(
Comparatorparing(ObjTest::getApplyStatusDesc,(x,y)->{
if(x == null && y != null){
return 1;
}else if(x !=null && y == null){
return -1;
}else if(x == null && y == null){
return -1;
}else{
//按照读取的list顺序排序
for(String sort : sortList){
if(sort.equals(x) || sort.equals(y)){
if(x.equals(y)){
return 0;
}else if(sort.equals(x)){
return -1;
}else{
return 1;
}
}
}
return 0;
}
}) .thenComparing(Comparatorparing(ObjTest::getRepaymentStatus,Comparator.nullsLast(Integer::compareTo))
.thenComparing(Comparatorparing(ObjTest::getOverStatus,Comparator.nullsLast(Integer::compareTo)).reversed()).thenComparing(C omparatorparing(ObjTest::getCreateDate)))
).List()).forEach( x->{
ObjTest o = new ObjTest();
objTestList.add(o);
});
objTestList.forEach(System.out::println);
}
这⾥需要注意:list.stream().sorted只是排好了顺序,输出⼀下会看到排好顺序的数据,但是它并不会把这个顺序保存,也就是在⽅法中return list 返回的依旧是个⽆序的数据。所以在这⾥我们需要把排好序的数据保存到新的list中,也就是这块代码的意义。
主要思路是:先按applyStatusDesc排序,再按repaymentStatus排序,再按 overStatus逆向排序,最后以时间排序
效果图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。