Java List操作5(sort—排序)

1、默认排序

实体类实现 Comparable 接口,实现compareTo()方法,然后调用Collections.sort(list);

package com.bangmart.device.monitor.vo.report;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class DeviceFaultReportHistogram implements Comparable{
    @ApiModelProperty(value = "时间")
    private String dateStr;
    @ApiModelProperty(value = "设备编码")
    private String facDevNo;
    @ApiModelProperty(value = "设备故障")
    private int deviceFaults;
    @ApiModelProperty(value = "退款故障")
    private int refundFaults;
    @ApiModelProperty(value = "网络故障")
    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;
    }
}

调用Collections.sort(list);
image.png

2、 比较器Comparator排序

上面的方法是默认排序,如果需求不是默认排序呢,那可以使用比较器Comparator排序,

  • Collections.sort(list,Comparator);
  • list.sort(Comparator);
  • lamdba表达式
 Collections.sort(list, new Comparator() {
                        @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() {
                        @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 多字段排序
//排序,先按照状态降序,再按照rank升序,再按照periods降序
            List resList = voList.stream().sorted(
                    Comparator.comparing(ActivityGoodVo::getStatus, Comparator.reverseOrder())
                    .thenComparing(ActivityGoodVo::getRank) ——对第一次排序后内的分组(state分组)进行rank排序
                    .thenComparing(ActivityGoodVo::getPeriods,Comparator.reverseOrder()))——对第二次排序后的分组(status_rank分组)进行排序
                    .collect(Collectors.toList());

上面这种排序是分组排序,跟在数据中是一样的,即

image.png

综上,使用stream排序可以把在数据库中的使用sql实现的,优化成在业务中实现,数据库资源是宝贵的,能在代码中实现的尽量在代码中实现,毕竟扩展服务比扩展数据库便宜的多。

你可能感兴趣的:(Java List操作5(sort—排序))