1盛卡、默認(rèn)排序
實體類實現(xiàn) Comparable 接口长搀,實現(xiàn)compareTo()方法,然后調(diào)用Collections.sort(list);
package com.bangmart.device.monitor.vo.report;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DeviceFaultReportHistogram implements Comparable<DeviceFaultReportHistogram>{
@ApiModelProperty(value = "時間")
private String dateStr;
@ApiModelProperty(value = "設(shè)備編碼")
private String facDevNo;
@ApiModelProperty(value = "設(shè)備故障")
private int deviceFaults;
@ApiModelProperty(value = "退款故障")
private int refundFaults;
@ApiModelProperty(value = "網(wǎng)絡(luò)故障")
private int networkFaults;
@Override
public int compareTo(DeviceFaultReportHistogram o1)
{
int i1 = Integer.valueOf(o1.getDateStr());
int i2 = Integer.valueOf(this.getDateStr());
//升序
return i2-i1;
//降序
// return i1-i2;
}
}
調(diào)用Collections.sort(list);
image.png
2豆赏、 比較器Comparator排序
上面的方法是默認(rèn)排序束凑,如果需求不是默認(rèn)排序呢彼哼,那可以使用比較器Comparator排序,
- Collections.sort(list,Comparator<T>);
- list.sort(Comparator<T>);
- lamdba表達式
Collections.sort(list, new Comparator<DeviceFaultReportHistogram>() {
@Override
public int compare(DeviceFaultReportHistogram o1, DeviceFaultReportHistogram o2) {
int i1 = Integer.valueOf(o1.getDateStr());
int i2 = Integer.valueOf(o2.getDateStr());
//升序
return i1-i2;
}
});
list.sort( new Comparator<DeviceFaultReportHistogram>() {
@Override
public int compare(DeviceFaultReportHistogram o1, DeviceFaultReportHistogram o2) {
int i1 = Integer.valueOf(o1.getDateStr());
int i2 = Integer.valueOf(o2.getDateStr());
//升序
return i1-i2;
}
});
Collections.sort(histograms,(a,b)-> Integer.valueOf(a.getDateStr())-Integer.valueOf(b.getDateStr()));
3湘今、Java8 stream流處理
- 3.1 按照dateStr字段排序
histogramList.stream().sorted(Comparator.comparing(DeviceFaultReportHistogram::getDateStr)).collect(Collectors.toList());
- 3.2 多字段排序
//排序敢朱,先按照狀態(tài)降序,再按照rank升序摩瞎,再按照periods降序
List<ActivityGoodVo> resList = voList.stream().sorted(
Comparator.comparing(ActivityGoodVo::getStatus, Comparator.reverseOrder())
.thenComparing(ActivityGoodVo::getRank) ——對第一次排序后內(nèi)的分組(state分組)進行rank排序
.thenComparing(ActivityGoodVo::getPeriods,Comparator.reverseOrder()))——對第二次排序后的分組(status_rank分組)進行排序
.collect(Collectors.toList());
上面這種排序是分組排序拴签,跟在數(shù)據(jù)中是一樣的,即
image.png
綜上旗们,使用stream排序可以把在數(shù)據(jù)庫中的使用sql實現(xiàn)的蚓哩,優(yōu)化成在業(yè)務(wù)中實現(xiàn),數(shù)據(jù)庫資源是寶貴的上渴,能在代碼中實現(xiàn)的盡量在代碼中實現(xiàn)岸梨,畢竟擴展服務(wù)比擴展數(shù)據(jù)庫便宜的多喜颁。