Java1.8 的 filter方法

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. 1. 惰性求值filter() 不会立即执行,需通过终止操作触发。
  2. 2. 链式调用:可与其他中间操作(如 map()sorted())组合使用。
  3. 3. 原集合不变filter() 返回新流,原集合内容不受影响。

4. 常见应用场景

  • • 数据筛选(如用户列表中筛选活跃用户)。
  • • 数据清洗(如过滤空值或无效数据)。
  • • 结合其他 Stream 方法(如 map() 转换数据后再过滤)。

通过以上示例,您可以快速掌握 filter() 方法的使用方式。如果有更复杂的需求,可以进一步结合 Predicate 的组合逻辑(如 and()or()negate())实现更灵活的筛选条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剽悍一小兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值