Java 流(Stream)API

一、理论说明

1. 流的定义

Java 流(Stream)是 Java 8 引入的新特性,用于对集合(如 List、Set)或数组进行高效的聚合操作(如过滤、映射、排序)和并行处理。流不存储数据,而是按需计算,支持链式调用,使代码更简洁、易读。

2. 流与集合的区别

特性集合(Collection)流(Stream)
数据存储存储元素,占用内存不存储数据,按需计算
遍历方式外部迭代(手动 for/foreach)内部迭代(自动处理)
一次性使用可重复遍历只能消费一次(类似迭代器)
延迟执行立即执行中间操作延迟,终止操作触发执行
并行支持需要手动实现多线程直接支持并行流(parallelStream()

二、流的创建与操作

1. 创建流

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;public class StreamExample {public static void main(String[] args) {// 1. 从集合创建List<String> list = Arrays.asList("a", "b", "c");Stream<String> stream = list.stream();// 2. 从数组创建String[] array = {"a", "b", "c"};Stream<String> arrayStream = Arrays.stream(array);// 3. 使用 Stream.of()Stream<String> ofStream = Stream.of("a", "b", "c");// 4. 创建无限流Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2);infiniteStream.limit(5).forEach(System.out::println); // 输出: 0, 2, 4, 6, 8}
}

2. 中间操作(返回新的流)

使用时需注意:流只能消费一次,消费后需重新创建。并行流适用于计算密集型任务,避免 I/O 操作。合理选择中间操作和终止操作,避免过度使用复杂流。流 API 是 Java 8 最具影响力的特性之一,广泛应用于数据处理、微服务、ORM 框架等场景。

  • 过滤filter(Predicate<T>)
  • 映射map(Function<T, R>)
  • 排序sorted() 或 sorted(Comparator<T>)
  • 去重distinct()
  • 截断limit(long maxSize)
  • 跳过skip(long n)
    List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 5);
    List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0)    // 过滤偶数.distinct()                // 去重.sorted()                  // 排序.collect(Collectors.toList()); // [2, 4]

    3. 终止操作(触发计算并关闭流)

  • 聚合count()max()min()
  • 匹配anyMatch()allMatch()noneMatch()
  • 收集collect(Collectors.toList())toSet()toMap()
  • 归约reduce()
  • 遍历forEach()
    List<String> words = Arrays.asList("apple", "banana", "cherry");// 计算总长度
    int totalLength = words.stream().mapToInt(String::length).sum(); // 结果: 5 + 6 + 6 = 17// 检查是否所有单词长度大于 3
    boolean allLong = words.stream().allMatch(w -> w.length() > 3); // true

    三、并行流(Parallel Stream)

    通过parallelStream()stream().parallel()创建并行流,利用多线程加速处理(适用于大数据量)。

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();

    注意:并行流的线程安全问题,避免在流操作中修改共享状态。

    四、Collectors 工具类

    Collectors提供了丰富的收集器,用于将流结果转换为集合、Map 或进行分组统计。

    1. 集合收集

    List<String> names = people.stream().map(Person::getName).collect(Collectors.toList());

    2. 分组统计

    Map<Integer, List<Person>> ageGroups = people.stream().collect(Collectors.groupingBy(Person::getAge));

    3. 字符串连接

    String joined = people.stream().map(Person::getName).collect(Collectors.joining(", ", "[", "]"));
    // 结果: "[Alice, Bob, Charlie]"

    五、应用实例

    1. 筛选与映射

    class Product {private String name;private double price;private Category category;// 构造方法、getter/setter 略
    }enum Category { FOOD, ELECTRONICS, CLOTHING }// 统计电子产品的平均价格
    List<Product> products = getProductList();
    double avgPrice = products.stream().filter(p -> p.getCategory() == Category.ELECTRONICS).mapToDouble(Product::getPrice).average().orElse(0.0);

    2. 分页处理

    List<Product> page2 = products.stream().skip(10)  // 跳过前10条.limit(10) // 取10条.collect(Collectors.toList());

    六、自我总结

  • Java 流 API 提供了一种高效、优雅的方式处理集合数据,其核心优势包括:

  • 代码简洁:链式调用减少冗余代码。
  • 内部迭代:自动处理遍历逻辑,提升可读性。
  • 并行支持:简化多线程编程,提升大数据处理性能。
  • 延迟执行:避免不必要的计算,优化性能。

      七、面试题

    题目:

    答案;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络协议分析 实验七 FTP、HTTP、DHCP

文章目录 实验7.1 FTP协议练习二 使用浏览器登入FTP练习三 在窗口模式下&#xff0c;上传/下传数据文件实验7.2 HTTP(Hyper Text Transfer Protocol)练习二 页面提交练习三 访问比较复杂的主页实验7.3 DHCP(Dynamic Host Configuration Protocol) 实验7.1 FTP协议 dir LIST&…

go语言学习进阶

目录 第一章 go语言中包的使用 一.main包 二.package 三.import 四.goPath环境变量 五.init包初始化 六.管理外部包 第二章 time包 第三章 File文件操作 一.FileInfo接口 二.权限 三.打开模式 四.File操作 五.读文件 参考1&#xff1a;Golang 中的 bufio 包详解…

Hue面试内容整理-后端框架

Cloudera 的 Hue 项目在后端采用了成熟的 Python Web 框架 Django,结合其他组件构建了一个可扩展、模块化的系统,便于与 Hadoop 生态系统中的各个组件集成。以下是 Hue 后端架构的详细介绍: 后端架构概览 1. Django Web 框架 Hue 的核心是基于 Django 构建的 Web 应用,负责…

Web-CSS入门

WEB前端&#xff0c;三部分&#xff1a;HTML部分、CSS部分、Javascript部分。 1.HTML部分&#xff1a;主要负责网页的结构层 2.CSS部分&#xff1a;主要负责网页的样式层 3.JS部分&#xff1a;主要负责网页的行为层 **基本概念** 层叠样式表&#xff0c;Cascading Style Sh…

2025年PMP 学习十六 第11章 项目风险管理 (总章)

2025年PMP 学习十六 第11章 项目风险管理 &#xff08;总章&#xff09; 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 目标: 提高项目中积极事件的概率和…

基于SpringBoot的小区停车位管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

HTML常用标签用法全解析:构建语义化网页的核心指南

HTML作为网页开发的基石&#xff0c;其标签的合理使用直接影响页面的可读性、SEO效果及维护性。本文系统梳理HTML核心标签的用法&#xff0c;结合语义化设计原则与实战示例&#xff0c;助你构建规范、高效的网页结构。 一、基础结构与排版标签 1.1 文档结构 <!DOCTYPE htm…

国产linux系统(银河麒麟,统信uos)使用 PageOffice自定义Word模版中的数据区域

​ PageOffice 国产版 &#xff1a;支持信创系统&#xff0c;支持银河麒麟V10和统信UOS&#xff0c;支持X86&#xff08;intel、兆芯、海光等&#xff09;、ARM&#xff08;飞腾、鲲鹏、麒麟等&#xff09;、龙芯&#xff08;Mips、LoogArch&#xff09;芯片架构。 在实际的Wor…

.NET Core liunx二进制文件安装

最近遇见个尴尬的事情&#xff0c;都2025年了。我需要部署一个自己多年前写的项目。由于时间紧、任务重&#xff0c;我懒得去升级到8.0了。于是计划在Ubuntu20.04上安装.NET Core3.1项目。可以使用包管理器却安装不上了。于是&#xff0c;我就尝试二进制文件安装。 实际上二进…

【python基础知识】Day 27 函数专题2:装饰器

知识点&#xff1a; 装饰器的思想&#xff1a;进一步复用函数的装饰器写法注意内部函数的返回值 装饰器教程 作业&#xff1a; 编写一个装饰器 logger&#xff0c;在函数执行前后打印日志信息&#xff08;如函数名、参数、返回值&#xff09; def logger(func):def wrapper(*ar…

MGX:多智能体管理开发流程

MGX的多智能体团队如何通过专家混合系统采用全新方法,彻底改变开发流程,与当前的单一智能体工具截然不同。 Lovable和Cursor在自动化我们的特定开发流程方面取得了巨大飞跃,但问题是它们仅解决软件开发的单一领域。 这就是MGX(MetaGPT X)的用武之地,它是一种正在重新定…

【未完】【GNN笔记】EvolveGCN:Evolving Graph Convolutional Networks for Dynamics Graphs

Evolving Graph Convolutional Networks for Dynamics Graphs 视频链接&#xff1a;《图神经网络》 相关系列&#xff1a; 《Dynamic Graph的分类》《动态图网络之Dynamic Self-Attention Network》 文章目录 Evolving Graph Convolutional Networks for Dynamics Graphs一、…

Go语言之路————并发

Go语言之路————并发 前言协程管道SelectsyncWaitGroup锁 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go&#xff0c;到后面能正常完成工作上的业务开发的过程&#xff0c;如…

Gmsh划分网格|四点矩形

先看下面这段官方自带脚本 /*********************************************************************** Gmsh tutorial 1** Variables, elementary entities (points, curves, surfaces), physical* entities (points, curves, surfaces)********************************…

leetcode0215. 数组中的第K个最大元素-medium

1 题目&#xff1a;数组中的第K个最大元素 官方标定难度&#xff1a;中 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时…

rocketmq 环境配置[python]

因本人是 python 开发&#xff0c;macbook 开发。windows 可以采取配置远程 linux 解释器或者 pycharm 专业版的 docker 解释器进行开发 M1 芯片 本地运行 rocketmq rocketmq Python 开源地址&#xff1a; https://github.com/apache/rocketmq-client-python 因为需要 linu…

OCCT知识笔记之OCAF框架详解

OCAF框架在OCCT项目中的构建与使用指南 Open CASCADE Application Framework (OCAF)是Open CASCADE Technology (OCCT)中用于管理CAD数据的核心框架&#xff0c;它提供了一种结构化方式来组织和管理复杂的CAD数据&#xff0c;如装配体、形状、属性(颜色、材料)和元数据等。本文…

go-数据库基本操作

1. 配置数据库 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm" ) #配置表结构 type User struct {ID int64 json:"id" gorm:"primary_key" // 主键ID自增长Username stringPassword string } #配置连接接信息 func…

【含文档+PPT+源码】基于大数据的交通流量预测系统

技术栈说明 技术栈&#xff1a; 后端&#xff1a;Django&#xff08;后端是前后端分离的&#xff09; 前端&#xff1a;Vue.js ElementUI 开发工具&#xff1a; Python3.9以上 Pycharm MySQL5.7/MySQL8 VSCode 项目演示视频 基于大数据的交通流量预测系统

海盗王3.0的数据库3合1并库处理方案

原版的海盗王数据库有3个accountserver&#xff0c;gamedb&#xff0c;tradedb&#xff0c;对应到是账号数据库&#xff0c;游戏数据库&#xff0c;商城数据库。 一直都有个想法&#xff0c;如何把这3个库合并到一起&#xff0c;这样可以实现一些功能。 涉及到sqlserver的数据库…