java中stream流对list排序参数化
时间: 2024-12-31 13:39:28 浏览: 5
### Java Stream API 对 List 进行参数化排序
在 Java 中,`Stream API` 提供了一种简洁而强大的方式来处理集合数据。对于 `List<String>` 的排序操作可以通过流的方式实现,并且能够利用自定义比较器来进行更复杂的排序逻辑。
#### 使用 Comparator 排序字符串列表并反转顺序
当需要按照特定规则对列表中的元素进行排序时,可以借助于 `Comparator` 来指定排序依据。例如,下面这段代码展示了如何基于字符串长度降序排列一个字符串列表:
```java
import java.util.*;
import java.util.stream.*;
public class SortExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "pear");
Collections.sort(
list,
Comparator.comparingInt((String item) -> item.length()).reversed()
);
System.out.println(list);
}
}
```
上述代码实现了根据字符串长度逆向排序的功能[^1]。
#### 参数化排序应用实例
为了进一步展示如何灵活运用 `Stream API` 和 `Comparator` 实现更加复杂的需求,在这里提供了一个关于学生对象 (`Student`) 列表的例子。假设有一个包含多个学生的列表,现在想要先按年级升序再按年龄降序对学生记录进行整理:
```java
import java.util.*;
import java.util.stream.Collectors;
class StudentSorter {
record Student(String name, int age, boolean member, Grade grade){}
enum Grade{
JUNIOR_ONE,JUNIOR_TWO,JUNIOR_THREE;
}
public static void main(String[] args){
List<Student> students = Arrays.asList(
new Student("Alice", 14, true, Grade.JUNIOR_TWO),
new Student("Bob", 15, false, Grade.JUNIOR_THREE),
new Student("Charlie", 13, true, Grade.JUNIOR_ONE));
List<Student> sortedStudents = students.stream().sorted(Comparator
.comparing(Student::grade)
.thenComparingInt(Student::age).reversed())
.collect(Collectors.toList());
sortedStudents.forEach(student ->
System.out.printf("%s (%d years old), %s\n",
student.name(),
student.age(),
student.grade()));
}
}
```
在这个例子中,首先通过 `comparing()` 方法指定了主要排序键——即 `Grade` 字段;接着调用了 `thenComparingInt()` 添加次要排序条件——也就是 `age` 属性,并对其结果进行了反向排序(`reversed()`)。最后使用 `Collectors.toList()` 将处理后的流重新转换成列表形式输出[^5]。
阅读全文