排序方法
List<類> list; 代表某集合
//返回 對象集合以類屬性一升序排序
list.stream().sorted(Comparator.comparing(類::屬性一));
//返回 對象集合以類屬性一降序排序 注意兩種寫法
list.stream().sorted(Comparator.comparing(類::屬性一).reversed());//先以屬性一升序,對升序結果進行屬性一降序
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()));//以屬性一降序
//返回 對象集合以類屬性一升序 屬性二升序
list.stream().sorted(Comparator.comparing(類::屬性一).thenComparing(類::屬性二));
//返回 對象集合以類屬性一降序 屬性二升序 注意兩種寫法
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二));//先以屬性一升序,對升序結果進行屬性一降序,再進行屬性二升序
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()).thenComparing(類::屬性二));//先以屬性一降序,再進行屬性二升序
//返回 對象集合以類屬性一降序 屬性二降序 注意兩種寫法
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一升序,對升序結果進行屬性一降序,再進行屬性二降序
list.stream().sorted(Comparator.comparing(類::屬性一,Comparator.reverseOrder()).thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一降序,再進行屬性二降序
//返回 對象集合以類屬性一升序 屬性二降序 注意兩種寫法
list.stream().sorted(Comparator.comparing(類::屬性一).reversed().thenComparing(類::屬性二).reversed());//先以屬性一升序,對升序結果進行屬性一降序,再進行屬性二升序,對前面結果進行屬性一降序屬性二降序(優先按照屬性一降序,屬性一相等時再按照屬性二降序)
list.stream().sorted(Comparator.comparing(類::屬性一).thenComparing(類::屬性二,Comparator.reverseOrder()));//先以屬性一升序,再進行屬性二降序
通過以上例子我們可以發現
-
Comparator.comparing(類::屬性一).reversed();
-
Comparator.comparing(類::屬性一,Comparator.reverseOrder());
兩種排序是完全不一樣的,一定要區分開來
1、是得到排序結果后再排序,
2、是直接進行排序,很多人會混淆導致理解出錯,2更好理解,建議使用2
實際例子:
有個Img類,有個排序號sort和創建時間createTime,要求先按照sort正序排列,然后按照createTime倒序排列
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Data
@ToString
public class Img {
@ApiModelProperty(value = "id")
private Integer id;
@ApiModelProperty(value = "排序號")
private Integer sort;
@ApiModelProperty(value = "創建時間")
private Date createTime;
public static void main(String[] args) {
List<Img> list = CollUtil.newArrayList();
for (int i = 1; i <= 3; i++) {
Img img = new Img();
img.setId(i);
img.setSort(i != 1 ? 2 : 1);
img.setCreateTime(i == 1 ? DateUtil.offset(new Date(), DateField.MINUTE, 3) : i == 2 ? DateUtil.offset(new Date(), DateField.MINUTE, 1) : DateUtil.offset(new Date(), DateField.MINUTE, 2));
list.add(img);
}
log.info("現有集合");
list.stream().forEach(item -> System.out.println(item));
log.info("使用reversed()排序");
List<Img> imgList = list.stream().sorted(Comparator.comparing(Img::getSort).thenComparing(Img::getCreateTime).reversed()).collect(Collectors.toList());
imgList.stream().forEach(item -> System.out.println(item));
log.info("使用Comparator.reverseOrder()排序");
List<Img> imgs = list.stream().sorted(Comparator.comparing(Img::getSort).thenComparing(Img::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
imgs.stream().forEach(item -> System.out.println(item));
}
}
打印結果
10:32:25.368 [main] INFO com.eternity.scrapy.modules.entity.Img - 現有集合
Img(id=1, sort=1, createTime=2022-02-09 10:35:25)
Img(id=2, sort=2, createTime=2022-02-09 10:33:25)
Img(id=3, sort=2, createTime=2022-02-09 10:34:25)
10:32:25.577 [main] INFO com.eternity.scrapy.modules.entity.Img - 使用reversed()排序
Img(id=3, sort=2, createTime=2022-02-09 10:34:25)
Img(id=2, sort=2, createTime=2022-02-09 10:33:25)
Img(id=1, sort=1, createTime=2022-02-09 10:35:25)
10:32:25.630 [main] INFO com.eternity.scrapy.modules.entity.Img - 使用Comparator.reverseOrder()排序
Img(id=1, sort=1, createTime=2022-02-09 10:35:25)
Img(id=3, sort=2, createTime=2022-02-09 10:34:25)
Img(id=2, sort=2, createTime=2022-02-09 10:33:25)