当前位置:首页 > Java > 正文

掌握Java过滤操作(从零开始学会使用Stream和Lambda进行高效数据筛选)

在日常的Java开发中,我们经常需要从集合中筛选出满足特定条件的数据。这种操作被称为Java过滤操作。随着Java 8引入Stream API和Lambda表达式,实现过滤变得异常简洁高效。本教程将手把手教你如何使用这些现代Java特性完成各种过滤任务,即使是编程新手也能轻松上手!

掌握Java过滤操作(从零开始学会使用Stream和Lambda进行高效数据筛选) Java过滤操作 Java Stream过滤 Java集合过滤 Java条件筛选 第1张

一、什么是Java过滤操作?

简单来说,Java过滤操作就是从一个数据集合(如List、Set等)中挑选出满足特定条件的元素,组成一个新的集合。例如:从学生列表中找出所有年龄大于18岁的学生,或从商品列表中筛选出价格低于100元的商品。

二、传统方式 vs Stream方式

在Java 8之前,我们通常使用for循环配合if判断来实现过滤:

// 传统方式:使用for循环过滤List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<Integer> evenNumbers = new ArrayList<>();for (Integer num : numbers) {    if (num % 2 == 0) {        evenNumbers.add(num);    }}System.out.println(evenNumbers); // 输出: [2, 4, 6, 8, 10]

而使用Java 8的Stream API,只需一行代码即可完成相同操作:

// Stream方式:使用filter方法List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<Integer> evenNumbers = numbers.stream()                                    .filter(n -> n % 2 == 0)                                    .collect(Collectors.toList());System.out.println(evenNumbers); // 输出: [2, 4, 6, 8, 10]

可以看到,Stream方式不仅代码更简洁,而且语义更清晰——“从numbers中过滤出偶数”。

三、Stream.filter() 方法详解

filter() 是Stream接口中的一个中间操作,它接收一个 Predicate<T> 函数式接口作为参数。该接口的抽象方法为 boolean test(T t),用于判断元素是否满足条件。

常见用法示例:

1. 过滤字符串列表

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 筛选出长度大于4的姓名List<String> longNames = names.stream()                              .filter(name -> name.length() > 4)                              .collect(Collectors.toList());System.out.println(longNames); // 输出: [Alice, Charlie]

2. 过滤自定义对象

假设我们有一个Student类:

class Student {    private String name;    private int age;    public Student(String name, int age) {        this.name = name;        this.age = age;    }    // getter方法    public String getName() { return name; }    public int getAge() { return age; }    @Override    public String toString() {        return name + "(" + age + ")";    }}

现在我们要筛选出年龄大于等于18岁的学生:

List<Student> students = Arrays.asList(    new Student("张三", 17),    new Student("李四", 19),    new Student("王五", 20),    new Student("赵六", 16));List<Student> adults = students.stream()                               .filter(s -> s.getAge() >= 18)                               .collect(Collectors.toList());System.out.println(adults); // 输出: [李四(19), 王五(20)]

四、组合多个过滤条件

有时我们需要同时满足多个条件。可以链式调用多个filter(),也可以在一个filter()中使用逻辑运算符。

// 方式1:链式调用List<Student> result1 = students.stream()                               .filter(s -> s.getAge() >= 18)                               .filter(s -> s.getName().startsWith("李"))                               .collect(Collectors.toList());// 方式2:单个filter中组合条件List<Student> result2 = students.stream()                               .filter(s -> s.getAge() >= 18 && s.getName().startsWith("李"))                               .collect(Collectors.toList());

五、实用技巧与注意事项

  • 惰性求值:Stream的filter是惰性操作,只有遇到终端操作(如collect、forEach)才会真正执行。
  • 不可变性:原始集合不会被修改,filter返回的是一个新Stream。
  • 性能优化:对于大集合,Stream的并行流(parallelStream)可提升性能,但需谨慎使用。
  • 空值处理:如果集合中可能包含null,应在filter中先判断,避免NullPointerException。

六、总结

通过本教程,你已经掌握了Java过滤操作的核心技能。无论是简单的数字筛选,还是复杂的对象条件判断,Stream API都能让你的代码更加优雅高效。记住关键点:stream().filter(条件).collect(...)

希望这篇关于Java Stream过滤Java集合过滤Java条件筛选的教程对你有所帮助!快去你的项目中实践吧!