Java stream sorted自定义排序规则实现多字段排序
Stream 提供了丰富的操作(中间操作和终端操作)集合元素的轮子,但Stream流操作不影响原始集合数据,执行结果是一个新的集合对象。在《Java stream sorted使用 Comparator 进行多字段排序》中,小编Wiener介绍了使用Java Stream流排序器Comparator对List集合进行多字段排序的方法,包括复杂实体对象多字段升降序排序方法,本文介绍两个新的排序方法:
1. 使用lambda表达式自定义排序规则;
2. 使用匿名内部类重写Comparator方法以定义排序规则。
测试数据中,类继续使用《Java stream sorted使用 Comparator 进行多字段排序》中的UserDTO,如下所示:
private static List<UserDTO> getUsers() {
List<UserDTO> users = new ArrayList<>();
users.add(new UserDTO(1L, "bWiener", 28, true));
users.add(new UserDTO(2L, "张莉", 17, false));
users.add(new UserDTO(3L, "李雪", 20, true));
users.add(new UserDTO(6L, "王二", 27, true));
users.add(new UserDTO(7L, "店小二", 27, false));
users.add(new UserDTO(8L, "楼兰胡杨", 21, true));
users.add(new UserDTO(9L, "aPrice", 28, true));
return users;
}
使用lambda表达式实现排序
lambda表达式又称为函数式编程,匿名函数可以将匿名函数代码块作为请求参数,语法更加简洁清爽,代码风格更加紧凑。使用lambda表达式修改sorted定义排序规则:
/**
* 使用lambda表达式定义排序规则
* 先按姓名降序,若年龄相同则按姓名降序
*/
private static void defineOrderByLambda() {
List<UserDTO> list = getUsers();
list.stream().sorted((e1, e2) -> {
if (e2.getAge().equals(e1.getAge())) {
return e2.getName().compareTo(e1.getName());
}
return Integer.compare(e2.getAge(), e1.getAge());
}).forEach(System.out::println);
}
匿名内部类重写Comparator方法实现排序
先创建Comparator接口的匿名内部类对象,然后在匿名内部类对象中重写compare方法,以实现排序。下述案例排序规则:先以年龄降序排列,再以姓名降序排列:
/**
* 使用匿名内部类重写Comparator方法以定义排序规则
*/
private static void defineOrderByInnerClass() {
List<UserDTO> list = getUsers();
list.stream().sorted(new Comparator<UserDTO>() {
@Override
public int compare(UserDTO e1, UserDTO e2) {
if (e2.getAge().equals(e1.getAge())) {
return e2.getName().compareTo(e1.getName());
}
return Integer.compare(e2.getAge(), e1.getAge());
}
}).forEach(System.out::println);
}
在Stream sorted() 中指定按照实体类的某个属性进行排序时,默认的排序规则是升序,如果需要降序,就需要调整对象的位置,使用对象2与对象1进行比较即可实现降序需求!
基于如下测试用例进行验证,发现这两种排序方式都好用:
public static void main(String[] args) {
defineOrderByLambda();
System.out.println("----------");
defineOrderByInnerClass();
}
执行结果:
UserDTO(id=1, name=bWiener, age=28, isBoy=true)
UserDTO(id=9, name=aPrice, age=28, isBoy=true)
UserDTO(id=6, name=王二, age=27, isBoy=true)
UserDTO(id=7, name=店小二, age=27, isBoy=false)
UserDTO(id=8, name=楼兰胡杨, age=21, isBoy=true)
UserDTO(id=3, name=李雪, age=20, isBoy=true)
UserDTO(id=2, name=张莉, age=17, isBoy=false)
----------
UserDTO(id=1, name=bWiener, age=28, isBoy=true)
UserDTO(id=9, name=aPrice, age=28, isBoy=true)
UserDTO(id=6, name=王二, age=27, isBoy=true)
UserDTO(id=7, name=店小二, age=27, isBoy=false)
UserDTO(id=8, name=楼兰胡杨, age=21, isBoy=true)
UserDTO(id=3, name=李雪, age=20, isBoy=true)
UserDTO(id=2, name=张莉, age=17, isBoy=false)
结束语
文章到这里就结束了,看完之后你有什么想法想要跟大家分享呢?评论区在等着你!
读后有收获,小礼物走一走,请作者喝咖啡。
Buy me a coffee. ☕Get red packets.
作者:楼兰胡杨
本文版权归作者和博客园共有,欢迎转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。