一、简介
Stream API 是 Java 8 中引入的一个新的抽象层,用于对集合数据进行操作和处理。它提供了一种新的、声明性的方式来处理集合数据,使代码更简洁、更易读、更易维护。
Stream API 的主要作用是对集合数据进行筛选、转换、聚合等操作,而无需显式地使用循环。它将集合数据的操作抽象成一个流(Stream),开发者可以在流上进行一系列的操作,最终得到想要的结果。
Stream API 的操作可以分为两类:中间操作和终端操作。
中间操作是指在流上进行的转换操作,如筛选、映射、排序等。这类操作返回的是一个新的流,可以进行链式调用。
终端操作是指对流进行最终操作,如聚合、收集、迭代等。终端操作触发实际的计算,并返回最终的结果或副作用。
以下是一些常见的 Stream API 操作方法:
- filter(Predicate):根据指定的条件筛选元素。
- map(Function):对每个元素执行指定的转换操作。
- sorted(Comparator):对元素进行排序。
- distinct():去除重复的元素。
- limit(n):截取前 n 个元素。
- skip(n):跳过前 n 个元素。
- forEach(Consumer):对每个元素执行指定的操作。
- collect(Collector):将流中的元素收集到一个集合中。
通过使用 Stream API,可以以更简洁、更易读的方式处理集合数据,减少了显式的循环和临时变量的使用,提高了代码的可读性和可维护性。
二、示例
1.filter(Predicate):筛选满足指定条件的元素。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Emily");
List<String> filteredNames = names.stream()
.filter(name -> name.length() > 4)
.collect(Collectors.toList());
// 输出结果为 ["Alice", "Charlie"]
2.map(Function):对每个元素执行指定的转换操作。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
// 输出结果为 [5, 3, 7]
3.sorted(Comparator):对元素进行排序。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
// 输出结果为 ["Alice", "Bob", "Charlie"]
4.distinct():去除重复的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 1, 4, 3);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
// 输出结果为 [1, 2, 3, 4]
5.limit(n):截取前 n 个元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
.limit(3)
.collect(Collectors.toList());
// 输出结果为 [1, 2, 3]
这些只是 Stream API 的一部分操作方法示例,还有其他许多操作方法可以用于更复杂的操作。你可以根据具体的需求选择相应的操作方法来处理集合数据。
6.组合过滤
过滤出年龄大于等于18岁且得分大于80分的学生:
class Student {
private String name;
private int age;
private int score;
public Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
// 省略 getter 和 setter 方法
}
List<Student> students = Arrays.asList(
new Student("Alice", 20, 85),
new Student("Bob", 17, 75),
new Student("Charlie", 19, 90)
);
List<Student> filteredStudents = students.stream()
.filter(student -> student.getAge() >= 18 && student.getScore() > 80)
.collect(Collectors.toList());