1. filter() 方法概述
filter()
是 Stream API 中的一个中间操作,用于根据指定条件筛选流中的元素。它接受一个 Predicate
函数式接口作为参数,返回一个仅包含满足条件元素的新流。
Stream<T> filter(Predicate<? super T> predicate)
- • 作用:从流中筛选出符合条件的元素。
- • 特点:惰性求值,只有当终止操作(如
collect()
、forEach()
)执行时才会触发实际计算。
2. 基础用法示例
示例 1:过滤整数列表中的偶数
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream()
.filter(num -> num % 2 == 0) // 筛选偶数
.collect(Collectors.toList()); // 转换为列表
System.out.println("Even numbers: " + evenNumbers);
// 输出:Even numbers: [2, 4, 6, 8, 10]
}
}
示例 2:过滤字符串列表中的特定字符
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry", "date", "grape");
List<String> filteredWords = words.stream()
.filter(word -> word.contains("a")) // 筛选包含 "a" 的字符串
.collect(Collectors.toList());
System.out.println("Filtered words: " + filteredWords);
// 输出:Filtered words: [apple, banana, date, grape]
}
}
示例 3:过滤自定义对象列表
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() { return age; }
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 22)
);
List<Person> filteredPeople = people.stream()
.filter(person -> person.getAge() >= 25) // 筛选年龄≥25的人
.collect(Collectors.toList());
System.out.println("Filtered people: " + filteredPeople);
// 输出:Filtered people: [Alice (25), Bob (30)]
}
}
3. 注意事项
- 1. 惰性求值:
filter()
不会立即执行,需通过终止操作触发。 - 2. 链式调用:可与其他中间操作(如
map()
、sorted()
)组合使用。 - 3. 原集合不变:
filter()
返回新流,原集合内容不受影响。
4. 常见应用场景
- • 数据筛选(如用户列表中筛选活跃用户)。
- • 数据清洗(如过滤空值或无效数据)。
- • 结合其他 Stream 方法(如
map()
转换数据后再过滤)。
通过以上示例,您可以快速掌握 filter()
方法的使用方式。如果有更复杂的需求,可以进一步结合 Predicate
的组合逻辑(如 and()
、or()
、negate()
)实现更灵活的筛选条件。