一、排序方法
Java 8 Stream提供了sorted()方法用于排序,该方法可以配合lambda表达式实现比较器Comparator的功能。在Java 8之前,需要实现Comparator接口的compare()方法才能进行排序,而现在可以使用lambda表达式极大地简化了代码。下面是一个简单的例子:
Listlist = Arrays.asList(5, 3, 1, 4, 2); list.stream() .sorted((a, b) -> a.compareTo(b)) .forEach(System.out::println);
上述代码使用了lambda表达式进行比较,输出结果为:1, 2, 3, 4, 5。
二、方法链排序
Java 8 Stream提供了多个方法可以进行链式排序,如sorted()、distinct()、limit()和skip()等,下面是一个排序和去重的例子:
Listlist = Arrays.asList(5, 3, 1, 4, 2, 3); list.stream() .sorted() .distinct() .forEach(System.out::println);
输出结果为:1, 2, 3, 4, 5。使用方法链可以将多个操作组合在一起,代码可读性更好。
三、对象排序
Java 8 Stream可以对对象进行排序,需要实现Comparable接口或者自定义比较器Comparator,并将其作为sorted()方法的参数传递进去。下面是一个对象排序的例子:
class Student implements Comparable<Student> { private int id; private String name; private int age; public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public String getName() { return name; } public int getAge() { return age; } @Override public int compareTo(Student other) { return Integer.compare(this.getId(), other.getId()); } } List<Student> list = Arrays.asList( new Student(2, "Tom", 20), new Student(1, "Jack", 22), new Student(3, "Peter", 18) ); list.stream() .sorted() .forEach(s -> System.out.println(s.getName()));
上述代码中,Student类实现了Comparable接口,并且重写了compareTo()方法实现按照id排序。输出结果为:Jack, Tom, Peter。
四、反向排序
Java 8 Stream提供了方法reversed()用于对排序方式进行反向排序,下面是一个反向排序的例子:
List<Integer> list = Arrays.asList(5, 3, 1, 4, 2); list.stream() .sorted(Comparator.reverseOrder()) .forEach(System.out::println);
输出结果为:5, 4, 3, 2, 1。
五、多条件排序
Java 8 Stream可以使用多个比较器进行排序操作,下面是一个按照年龄和姓名进行排序的例子:
List<Student> list = Arrays.asList( new Student(1, "Tom", 20), new Student(2, "Jack", 22), new Student(3, "Peter", 18), new Student(4, "Tom", 25), new Student(5, "Jack", 18) ); list.stream() .sorted(Comparator.comparing(Student::getAge) .thenComparing(Student::getName)) .forEach(s -> System.out.println(s.getName() + ": " + s.getAge()));
上述代码中,排序使用了比较器Comparator.comparing()和thenComparing()方法,输出结果为:Jack: 18, Peter: 18, Tom: 20, Jack: 22, Tom: 25。