您的位置:

Java 8 Stream排序实现方法

一、排序方法

Java 8 Stream提供了sorted()方法用于排序,该方法可以配合lambda表达式实现比较器Comparator的功能。在Java 8之前,需要实现Comparator接口的compare()方法才能进行排序,而现在可以使用lambda表达式极大地简化了代码。下面是一个简单的例子:

List list = 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()等,下面是一个排序和去重的例子:

List list = 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。