Java Stream API | Java Stream API 中 `filter()`的使用
文章目录
- 概述
- 方法签名
- 用途
- 示例
- 示例1:简单过滤
- 示例2:多条件过滤
- 注意事项
- 总结
概述
在Java 8及更高版本中引入的Stream API提供了一种功能强大的方式来处理集合数据。filter()
方法是Stream API中最基本的操作之一,它允许开发者基于某些条件筛选流中的元素。本文档将详细介绍如何使用 filter()
方法,并提供多个示例来展示其应用。
方法签名
default Stream<T> filter(Predicate<? super T> predicate)
-
参数:
predicate
: 一个Predicate
对象,它定义了一个测试函数test(T t)
,该函数接受一个类型为T
的参数,并返回一个布尔值表示该元素是否应被保留。
-
返回值:
- 返回一个新的流,其中只包含那些通过了
predicate
测试的元素。
- 返回一个新的流,其中只包含那些通过了
用途
filter()
方法主要用于从数据集中筛选出符合条件的子集。它通常与其他流操作(如 map()
、reduce()
等)结合使用,以构建复杂的流水线式数据处理逻辑。
示例
示例1:简单过滤
假设我们有一个字符串列表,我们希望筛选出其中长度大于3的字符串:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FilterExample {
public static void main(String[] args) {
List<String> words = Arrays.asList("hello", "hi", "world", "yes", "no");
// 使用 filter() 筛选出长度大于3的字符串
List<String> longWords = words.stream()
.filter(word -> word.length() > 3)
.collect(Collectors.toList());
System.out.println(longWords); // 输出:[hello, world]
}
}
示例2:多条件过滤
如果我们要从一个人员列表中筛选出年龄大于20岁且名字以 ‘A’ 开头的人:
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 String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class FilterExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 22),
new Person("Andy", 25),
new Person("Zoe", 19)
);
// 使用 filter() 过滤年龄大于20岁且名字以 'A' 开头的人
List<Person> filteredPeople = people.stream()
.filter(person -> person.getAge() > 20)
.filter(person -> person.getName().startsWith("A"))
.collect(Collectors.toList());
System.out.println(filteredPeople); // 输出:[Person(name=Alice, age=30), Person(name=Andy, age=25)]
}
}
注意事项
filter()
是一个中间操作,必须与其他终止操作(如collect()
,forEach()
,reduce()
,toArray()
等)一起使用,才能触发实际的数据处理。- 使用
filter()
时,要关注性能问题。多次使用filter()
会增加流中元素的遍历次数,从而影响性能。 - 处理大数据集时,可以考虑使用并行流 (
parallelStream()
) 来提高处理速度,但请注意,这可能会改变元素的处理顺序。
总结
filter()
方法是Stream API中的一个重要组成部分,它简化了数据筛选的过程。通过合理地运用 filter()
方法,开发者可以轻松地实现复杂的数据筛选逻辑,从而使代码更加简洁、易读。结合其他Stream操作,filter()
能够帮助开发者快速构建高效的数据处理流程。