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

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() 能够帮助开发者快速构建高效的数据处理流程。


http://www.kler.cn/news/309997.html

相关文章:

  • TCP/IP Socket用于测试免费使用的服务器端
  • window下idea中scala的配置
  • web基础—dvwa靶场(五)File Upload
  • HarmonyOS开发之自定义构建函数
  • gi清除无用缓存
  • 【Elasticsearch系列】Elasticsearch中的分页
  • Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码
  • 利用物化视图刷新同步表记录(2-rowid)
  • 828华为云征文|Flexus云服务器X实例部署宝塔运维面板
  • 大数据处理技术:分布式文件系统HDFS
  • 基础漏洞——SQL注入原理和利用
  • 职业院校数据科学与大数据技术专业人工智能实训室建设方案
  • 【Linux篇】TCP/IP协议(笔记)
  • 深入探索Go语言中的函数:匿名函数、指针参数与函数返回
  • vue3中如何拿到vue2中的this
  • 嵌入式epoll面试题面试题及参考答案
  • 金蝶SHR,在列表对某个金额字段汇总展示的需求
  • 英特尔剥离芯片代工业务 与亚马逊达成重要合作
  • 五大注入攻击网络安全类型介绍
  • AutoSar AP 面向服务通信的提供者和消费者“连接”的方法
  • VUE实现刻度尺进度条
  • Java-数据结构-优先级队列(堆)-(一) (;´д`)ゞ
  • 后端id设置long类型时,传到前端,超过19位最后两位为00
  • k8s用StatefulSet部署redis
  • 图神经网络模型扩展(5)--2
  • 《Effective C++》第三版——让自己习惯C++
  • SpringDataJPA基础增删改查
  • 【OpenGL 学习笔记】01 - CLion 配置 CMake 运行初始 demo
  • 【PyTorch入门·求导相关】一文解释 PyTorch的求导 (backward、autograd.grad)
  • C#中抽象类和接⼝有什么区别?