1、单个字段排序
升序
list.stream().sorted(Comparator.comparing(User::getAge))
.forEach(System.out::println);
运行结果:
User(name=王五在·, age=15, id=3, birthday=Sun Sep 12 01:55:59 CST 2021)
User(name=张三, age=18, id=2, birthday=Fri Sep 10 01:55:59 CST 2021)
User(name=李四, age=19, id=1, birthday=Sat Sep 11 01:55:59 CST 2021)
降序reversed()
list.stream().sorted(Comparator.comparing(User::getAge).reversed())
.forEach(System.out::println);
或者
list.stream().sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder()))
.forEach(System.out::println);
运行结果:
User(name=李四, age=19, id=1, birthday=Sat Sep 11 01:55:59 CST 2021)
User(name=张三, age=18, id=2, birthday=Fri Sep 10 01:55:59 CST 2021)
User(name=王五在·, age=15, id=3, birthday=Sun Sep 12 01:55:59 CST 2021)
2、多个字段排序
list.stream().sorted(Comparator.comparing(User::getAge)
.thenComparing(User::getId)
.reversed())
.forEach(System.out::println);
或
list.stream().sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder())
.thenComparing(User::getId, Comparator.reverseOrder()))
.collect(Collectors.toList()).forEach(System.out::println);
运行结果:
总结:
Comparator.reverseOrder()是让某个条件进行倒序排序. reversed()是让他前面所有字段进行倒序,从左到右,当第一个字段有相同的字段,才根据第二个字段进行排序。
例如:Comparator.comparing(年龄).reversed(),此时年龄倒序; Comparator.comparing(年龄).thenComparing(序号).reversed(),此时年龄和序号进行倒序。
Comparator.comparing(名称).thenComparing(年龄).reversed().thenComparing(序号),此时名称和年龄会倒序,序号会升序。
那么问题来了,咱们加多个.reversed()会发生什么事情? 变成Comparator.comparing(状态).reversed().thenComparing(年龄).reversed() 假如多个排序条件的排序方向不一致,需要倒序的字段应该用Comparator.reverseOrder()。
那么问题来了,咱们加多个.reversed()会发生什么事情?
变成Comparator.comparing(年龄).reversed().thenComparing(序号).reversed()
list.stream().sorted(Comparator.comparing(User::getAge).reversed()
.thenComparing(User::getId)
.reversed()).forEach(System.out::println);
运行结果:
我们看见年龄并未排序,只有序号排序了。所以我们可以得出多个reversed()以最后一个
为准。
1.假如多个排序条件都为倒序,reversed()应该写在最后。
2.假如多个排序条件的排序方向不一致,需要倒序的字段应该用Comparator.reverseOrder()。
3、自定义排序
如果对象需要进行一系列操作后的结果进行排序,需要使用自定义排序。
List<File> fileList = Arrays.stream(files).sorted((o1, o2) -> {
if (FileTool.getFileCreateTime(o1).compareTo(FileTool.getFileCreateTime(o2)) > 0) {
return -1;
}
return 1;
}).collect(Collectors.toList());
public static Long getFileCreateTime(File file){
if (file == null) {
return null;
}
BasicFileAttributes attr = null;
try {
Path path = file.toPath();
attr = Files.readAttributes(path, BasicFileAttributes.class);
} catch (IOException e) {
e.printStackTrace();
}
// 创建时间
Instant instant = attr.creationTime().toInstant();
// 更新时间
// Instant instant = attr.lastModifiedTime().toInstant();
// 上次访问时间
// Instant instant = attr.lastAccessTime().toInstant();
return instant.toEpochMilli();
}