有些场景不能使用sql排序时,利用Java8的stream流能够很方便地对List内的元素进行排序操作。
例如用于排序的集合为List<类> rankList = new ArrayList<>();
一、单字段排序比较简单,使用reversed()或Comparator.reverseOrder()都可以
1.升序:
rankList.stream().sorted(Comparator.comparing(类::属性一)).collect(Collectors.toList());
2.降序:
方法1-先对属性值进行升序,再对结果进行降序
rankList.stream().sorted(Comparator.comparing(类::属性一).reversed()).collect(Collectors.toList());
方法2-直接对属性值进行降序
rankList.stream().sorted(Comparator.comparing(类::属性一, Comparator.reverseOrder())).collect(Collectors.toList());
二、进行多字段排序,需要注意写法
1.属性一升序,属性二升序:
rankList.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二)).collect(Collectors.toList());
2.属性一升序,属性二降序:
方法1-先对属性一升序,结果进行降序后,再对属性二升序,最后结果进行降序(属性一排序了三次)
rankList.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二).reversed()).collect(Collectors.toList());
方法2-先对属性一升序,再对属性二降序
rankList.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二, Comparator.reverseOrder())).collect(Collectors.toList());
3.属性一降序,属性二升序:
方法1-先对属性一升序,结果进行降序后,再对属性二升序
rankList.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二)).collect(Collectors.toList());
方法2-先对属性一降序,再对属性二升序
rankList.stream().sorted(Comparator.comparing(类::属性一, Comparator.reverseOrder()).thenComparing(类::属性二)).collect(Collectors.toList());
4.属性一降序,属性二降序:
方法1-先对属性一升序,结果进行降序后,再对属性二降序
rankList.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二, Comparator.reverseOrder())).collect(Collectors.toList());
方法2-先对属性一降序,再对属性二降序
rankList.stream().sorted(Comparator.comparing(类::属性一, Comparator.reverseOrder()).thenComparing(类::属性二, Comparator.reverseOrder())).collect(Collectors.toList());
方法3-先对属性一升序,再对属性二升序,最后结果进行降序
rankList.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二).reversed()).collect(Collectors.toList());
总结:多字段需要降序时,使用Comparator.reverseOrder()更好理解