工作记录------Stream排序应用
顺序、逆序、多条件排序
DTO
@Data
@ToString
class Teacher{
private Integer id;
private String name;
private Integer age;
private Integer tall;
private Date birthday;
}
集合:
List<Teacher> teacherList = new ArrayList<>();
Teacher teacher = new Teacher();
teacher.setId(1);
teacher.setAge(10);
teacher.setName("张一");
Teacher teacher2 = new Teacher();
teacher2.setId(2);
teacher2.setAge(20);
teacher2.setName("李二");
Teacher teacher3 = new Teacher();
teacher3.setId(3);
teacher3.setAge(30);
teacher3.setName("王三");
Teacher teacher4 = new Teacher();
teacher4.setId(1);
teacher4.setAge(30);
teacher4.setName("赵四");
teacherList.add(teacher);
teacherList.add(teacher2);
teacherList.add(teacher3);
teacherList.add(teacher4);
升序排序,年龄升序
按照年龄
Comparator.comparing(放实体类名称::放列名):添加排序字段;
teacherList.stream().sorted(Comparator.comparing(Teacher::getAge))
.forEach(System.out::println);
输出结果:
Teacher(id=1, name=张一, age=10, tall=null, birthday=null)
Teacher(id=2, name=李二, age=20, tall=null, birthday=null)
Teacher(id=3, name=王三, age=30, tall=null, birthday=null)
Teacher(id=1, name=赵四, age=30, tall=null, birthday=null)
降序排序,年龄降序
按照年龄
Comparator.reverseOrder() :降序排序
teacherList.stream().sorted(Comparator.comparing(Teacher::getAge,reverseOrder()))
.forEach(System.out::println);
输出结果:
Teacher(id=3, name=王三, age=30, tall=null, birthday=null)
Teacher(id=1, name=赵四, age=30, tall=null, birthday=null)
Teacher(id=2, name=李二, age=20, tall=null, birthday=null)
Teacher(id=1, name=张一, age=10, tall=null, birthday=null)
多条件排序,先按照年龄升序,再ID升序
通过在Comparator.comparing()后,再调用thenComparing方法。
teacherList.stream().sorted(
Comparator.comparing(Teacher::getAge)
.thenComparing(Teacher::getId))
.forEach(System.out::println);
输出结果:
Teacher(id=1, name=张一, age=10, tall=null, birthday=null)
Teacher(id=2, name=李二, age=20, tall=null, birthday=null)
Teacher(id=1, name=赵四, age=30, tall=null, birthday=null)
Teacher(id=3, name=王三, age=30, tall=null, birthday=null)
多条件排序,先按照ID升序,再年龄降序
同理,只是对需要降序的字段,传入reverseOrder()。
teacherList.stream().sorted(
Comparator.comparing(Teacher::getId)
.thenComparing(Teacher::getAge,reverseOrder()))
.forEach(System.out::println);
结果:
Teacher(id=1, name=赵四, age=30, tall=null, birthday=null)
Teacher(id=1, name=张一, age=10, tall=null, birthday=null)
Teacher(id=2, name=李二, age=20, tall=null, birthday=null)
Teacher(id=3, name=王三, age=30, tall=null, birthday=null)
多条件排序,先按照ID降序,再年龄升序
teacherList.stream().sorted(
Comparator.comparing(Teacher::getId,reverseOrder())
.thenComparing(Teacher::getAge))
.forEach(System.out::println);
输出结果:
Teacher(id=3, name=王三, age=30, tall=null, birthday=null)
Teacher(id=2, name=李二, age=20, tall=null, birthday=null)
Teacher(id=1, name=张一, age=10, tall=null, birthday=null)
Teacher(id=1, name=赵四, age=30, tall=null, birthday=null)
多条件排序,先按照ID降序,再年龄降序
teacherList.stream().sorted(
Comparator.comparing(Teacher::getId,reverseOrder())
.thenComparing(Teacher::getAge,reverseOrder()))
.forEach(System.out::println);
输出结果:
Teacher(id=3, name=王三, age=30, tall=null, birthday=null)
Teacher(id=2, name=李二, age=20, tall=null, birthday=null)
Teacher(id=1, name=赵四, age=30, tall=null, birthday=null)
Teacher(id=1, name=张一, age=10, tall=null, birthday=null)
如需要再增加排序的条件,只需要再增加.thenComparing()方法即可。
以上对排序的操作,能够应对工作中大部分需要排序的情况