当前位置:   article > 正文

Java8 特性详解 --Lambda 表达式之排序_lambad表达式中.sorted中判断排序字段

lambad表达式中.sorted中判断排序字段

创建测试类:

  1. public class Student implements Comparable<Student> {
  2. private int age;
  3. private String nameEn;
  4. private int grade;
  5. public Student(int age, String nameEn, int grade) {
  6. this.age = age;
  7. this.nameEn = nameEn;
  8. this.grade = grade;
  9. }
  10. public int getAge() {
  11. return age;
  12. }
  13. public void setAge(int age) {
  14. this.age = age;
  15. }
  16. public String getNameEn() {
  17. return nameEn;
  18. }
  19. public void setNameEn(String nameEn) {
  20. this.nameEn = nameEn;
  21. }
  22. public int getGrade() {
  23. return grade;
  24. }
  25. public void setGrade(int grade) {
  26. this.grade = grade;
  27. }
  28. public static int compare(Student s1, Student s2) {
  29. return Integer.compare(s1.getAge(), s2.getAge());
  30. }
  31. @Override
  32. public int compareTo(Student s) {
  33. return Integer.compare(this.getAge(), s.getAge());
  34. }
  35. }
  36. /**
  37. * 初始化数据
  38. *
  39. * @return
  40. */
  41. public static List<Student> initData() {
  42. List<Student> list = new ArrayList<>();
  43. list.add(new Student(11, "zhangsan", 5));
  44. list.add(new Student(12, "lisi", 5));
  45. list.add(new Student(9, "wangwu", 6));
  46. list.add(new Student(13, "zhaoliu", 6));
  47. list.add(new Student(8, "tianqi", 3));
  48. list.add(new Student(6, "wangba", 1));
  49. list.add(new Student(8, "jiujiu", 2));
  50. return list;
  51. }

传统排序方式

1.在 Java 8 之前,对集合进行排序要为 Comparator 创建一个匿名内部类用来排序,比如,按照 age 字段从小到大排序:

  1. /** * 传统匿名内部类比较器 */
  2. @Test
  3. public void soreted1() {
  4. List<Student> list = Java8SortedDemo.initData();
  5. list.sort(new Comparator<Student>() {
  6. @Override
  7. public int compare(Student s1, Student s2) {
  8. return Integer.compare(s1.getAge(), s2.getAge()); }
  9. });
  10. Assert.assertEquals(list.get(0).getNameEn(), "wangba");
  11. }

2.或者让 Student 实现 Comparable 接口,复写 compareTo 方法,同样按照 age 字段从小到大排序:

  1. @Override
  2. public int compareTo(Student s) {
  3. return Integer.compare(this.getAge(), s.getAge());
  4. }
  5. /** * 实现Comparable接口 */
  6. @Test
  7. public void soreted2() {
  8. List<Student> list = Java8SortedDemo.initData();
  9. Collections.sort(list);
  10. Assert.assertEquals(list.get(0).getNameEn(), "wangba");
  11. }

java8 排序方式

3.在 java8 中引入了重要的特性之一 lambda,根据 Lambda 表达式的介绍,我们现在可以不使用匿名内部类,只使用简单实用的语义就可以得到相同的结果,按照 age 字段从小到大排序:

  1. /** * java8的Lambda,显式指定比较类型 */
  2. @Test
  3. public void soreted3() {
  4. List<Student> list = Java8SortedDemo.initData();
  5. list.sort((Student s1, Student s2) -> Integer.compare(s1.getAge(), s2.getAge()));
  6. Assert.assertEquals(list.get(0).getNameEn(), "wangba");
  7. }

4.我们甚至可以省略类型,让编译器自行推测,按照 age 字段从小到大排序:

  1. /** * java8的Lambda,不指定比较类型 */
  2. @Test
  3. public void soreted4() {
  4. List<Student> list = Java8SortedDemo.initData();
  5. list.sort((s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()));
  6. Assert.assertEquals(list.get(0).getNameEn(), "wangba");
  7. }

5.我们还可以使用静态方法排序,按照 age 字段从小到大排序:

  1. public static int compare(Student s1, Student s2) {
  2. return Integer.compare(s1.getAge(), s2.getAge());
  3. }
  4. /** * 自定义静态方法 */
  5. @Test
  6. public void soreted5() {
  7. List<Student> list = Java8SortedDemo.initData();
  8. list.sort(Student::compare);
  9. Assert.assertEquals(list.get(0).getNameEn(), "wangba");
  10. }

6.当然,java8 为我们准备好了通用的 Comparator.comparing 方法,按照 age 字段从小到大排序:

  1. /** * Comparator提供的静态方法 */
  2. @Test
  3. public void soreted6() {
  4. List<Student> list = Java8SortedDemo.initData();
  5. list.sort(Comparator.comparing(Student::getAge));
  6. Assert.assertEquals(list.get(0).getNameEn(), "wangba");
  7. }

java8 排序方法拓展:

java8 同样让我们具备编写更复杂逻辑排序的方法表达式,

7.比如,反转排序,按照 age 字段从大到小排序:

  1. /** * 反转排序 */
  2. @Test
  3. public void soreted7() {
  4. List<Student> list = Java8SortedDemo.initData();
  5. list.sort(Comparator.comparing(Student::getAge).reversed());
  6. Assert.assertEquals(list.get(0).getNameEn(), "zhaoliu");
  7. }

8.比如,多字段组合排序,先按照 grade 从大到小,相同则按照 age 从大到小排序:

  1. /** * 多字段组合排序(匿名类方式) */
  2. @Test
  3. public void soreted8() {
  4. List<Student> list = Java8SortedDemo.initData();
  5. list.sort((s1, s2) -> {
  6. if (Integer.compare(s1.getGrade(), s2.getGrade()) != 0) {
  7. return Integer.compare(s2.getGrade(), s1.getGrade());
  8. }
  9. return Integer.compare(s2.getAge(), s1.getAge());
  10. });
  11. Assert.assertEquals(list.get(0).getNameEn(), "zhaoliu");
  12. }

9.java8 的 Comparator 为我们准备了更便利的链式风格组合排序方式,先按照 grade 从大到小,相同则按照 age 从小到大排序:

  1. /**
  2. * 多字段组合排序(链式接口)
  3. */
  4. @Test
  5. public void soreted9() {
  6. List<Student> list = Java8SortedDemo.initData();
  7. list.sort(Comparator.comparing(Student::getGrade).reversed().thenComparing(Student::getAge));
  8. Assert.assertEquals(list.get(0).getNameEn(), "wangwu");
  9. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/867355
推荐阅读
相关标签
  

闽ICP备14008679号