JDK 1.8 Stream API:集合流处理深度解析

JDK 1.8 Stream API:集合流处理深度解析

摘要:Stream API 是 JDK 1.8 的革命性特性,它将集合操作从传统迭代升级为声明式函数式处理。Stream API三个阶段(创建→中间操作→终端操作)详解流处理机制,辅以代码示例与白话解读,掌握流处理,是Java开发者迈向现代化编程的关键一步。


一、流处理核心三阶段
  1. 流创建(Source)
    将集合转化为流管道:

    List<String> list = Arrays.asList("A", "B", "C");
    Stream<String> stream = list.stream(); // 集合→流
    

    白话:就像把一箱零件倒上流水线传送带。

  2. 中间操作(Intermediate Operations)
    对数据进行加工处理,延迟执行(不触发实际计算):

    stream.filter(s -> s.startsWith("A"))  // 过滤.map(String::toLowerCase)         // 转换.sorted();                        // 排序
    

    白话:流水线上的筛选机、打磨机、排序机,但机器尚未启动。

  3. 终端操作(Terminal Operations)
    触发流水线执行并输出结果:

    long count = stream.count(); // 触发计算,返回元素数量
    

    白话:按下启动按钮,传送带开始运转并输出成品。

⚠️ 关键特性:流不可复用(终端操作后自动关闭),需重新创建。


二、常用中间操作详解
操作类型方法功能描述白话比喻
筛选过滤filter(Predicate)条件过滤元素质检员剔除次品
数据类型转换map(Function)元素类型转换(如String→Int)零件重新塑形
去重处理distinct()移除重复元素剔除重复零件
长度控制limit(maxSize)截取前N个元素只取前100个零件
排序操作sorted()自然排序按零件编号排序
跳过元素skip(n)跳过前N个元素丢弃前10个零件

集合流(Stream)是函数式编程的核心工具,提供高效的数据处理能力。以下是典型用法和案例:

代码示例1


List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);
numbers.stream().filter(n -> n > 2)      // 筛选大于2的数 → [3,4,5,9].map(n -> n * 2)         // 每个元素×2 → [6,8,10,18].distinct()              // 去重 → [6,8,10,18].sorted()                // 排序 → [6,8,10,18].limit(3);               // 取前3个 → [6,8,10]

示例2 (过滤与映射)

//场景:从数据集中提取特定条件元素并转换格式
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 过滤长度>3的名字并转为大写
List<String> result = names.stream().filter(name -> name.length() > 3)   // 过滤条件.map(String::toUpperCase)            // 转换操作.collect(Collectors.toList());       // 收集结果// 输出: [ALICE, CHARLIE, DAVID]

示例3 (聚合计算)


//场景:统计数值集合的聚合值
List<Integer> numbers = Arrays.asList(3, 7, 2, 9, 5);// 计算最大值、总和与平均值
int max = numbers.stream().max(Integer::compare).orElse(0);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
double avg = numbers.stream().mapToInt(i -> i).average().orElse(0);// 输出: max=9, sum=26, avg=5.2

示例4 (分组与分区)


//场景:按属性对对象分组
class Person {String name;int age;// 构造方法省略
}List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 30),new Person("Charlie", 25)
);// 按年龄分组
Map<Integer, List<Person>> ageGroup = people.stream().collect(Collectors.groupingBy(p -> p.age));// 输出: {25=[Alice, Charlie], 30=[Bob]}// 按年龄是否>=30分区
Map<Boolean, List<Person>> partition = people.stream().collect(Collectors.partitioningBy(p -> p.age >= 30));// 输出: {false=[Alice, Charlie], true=[Bob]}

示例5 (链式操作)


//场景:多步骤数据处理流水线
List<String> data = Arrays.asList("a1", "b2", "c3", "a4", "null");// 过滤非空值 -> 提取数字 -> 转换为整数 -> 求和
int total = data.stream().filter(s -> !s.equals("null"))    // 过滤无效值.map(s -> s.substring(1))          // 提取数字部分.map(Integer::parseInt)            // 转为整数.reduce(0, Integer::sum);          // 累加求和// 输出: 1+2+3+4=10

示例6 (并行处理)


//场景:利用多核加速大规模数据处理
List<Integer> largeList = IntStream.range(1, 1000000).boxed().collect(Collectors.toList());// 并行计算平方和
long sumSquares = largeList.parallelStream().mapToLong(n -> n * n).sum();// 输出: 1²+2²+...+999999²的求和

示例7 (自定义收集器)


//场景:实现复杂聚合逻辑
//自定义收集器:拼接字符串并添加分隔符
Collector<String, StringBuilder, String> customCollector = Collector.of(StringBuilder::new,                 // 初始容器(sb, s) -> sb.append(s).append("|"), // 累加元素StringBuilder::append,              // 合并容器sb -> sb.deleteCharAt(sb.length()-1).toString() // 最终转换
);List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
String merged = fruits.stream().collect(customCollector);// 输出: "Apple|Banana|Cherry"

三、终端操作:触发结果输出
操作类型方法返回值白话比喻
循环遍历forEach(Consumer)void对每个成品贴标签
聚合统计count()long统计合格品数量
逻辑判断anyMatch(Predicate)boolean检查是否有瑕疵品
极值获取max(Comparator)Optional找出最大零件
集合转换collect(Collectors)Collection将成品打包入新箱子
数值计算reduce(BinaryOperator)Optional计算零件总重量

代码示例

// 判断是否存在大于10的数
boolean hasLarge = numbers.stream().anyMatch(n -> n > 10); // 转换为Set去重存储
Set<Integer> set = numbers.stream().collect(Collectors.toSet());// 求和操作
int sum = numbers.stream().reduce(0, (a, b) -> a + b); 

四、流处理优势总结
  1. 性能提升:并行流parallelStream()自动利用多核CPU。
    list.parallelStream().forEach(System.out::println); // 并行输出
    
  2. 代码简洁:链式调用替代多层循环嵌套。
  3. 函数式思维:聚焦"做什么"而非"如何做"。
  4. 声明式编程:通过链式调用描述处理逻辑,代码更简洁
  5. 延迟执行:操作按需触发,避免不必要的计算
  6. 无状态性:多数操作不修改源数据,符合函数式原则

💡 适用场景:大数据集过滤转换、统计报表生成、链式数据加工流水线。


结语:Stream API 通过三阶段管道模型,将集合操作转化为高效声明式处理。其核心价值在于:
代码可读性 ↑ + 并行能力 ↑ + 开发效率 ↑ \text{代码可读性} \uparrow + \text{并行能力} \uparrow + \text{开发效率} \uparrow 代码可读性+并行能力+开发效率

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

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

相关文章

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(二)

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷&#xff08;二&#xff09; 第一部分&#xff1a;第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&#xff08;可以培训有答案&#xff09;任务 2&…

AiPy实战(5):效率革命!5分钟构建行业分析报告

在当今数字化时代&#xff0c;数据呈指数级增长&#xff0c;行业分析报告对于企业的决策制定愈发关键。传统上&#xff0c;撰写一份行业分析报告&#xff0c;需要分析师耗费大量时间从各类数据库、新闻资讯平台、行业报告中手动收集数据&#xff0c;再进行整理、分析和撰写&…

docker小白自存-windows系统通过docker安装n8n-nodes-puppeteer

n8n上直接在社区下载puppeteer节点&#xff0c;使用时会报错说没有chromium依赖。 找到了n8n-nodes-puppeteer的github试图解决 根据他的docker安装指南执行&#xff0c;运行容器时会报exec /docker-custom-entrypoint.sh: no such file or directory &#xff08;明明文件都有…

脚本shebang的作用与使用方法

#!&#xff08;称为 shebang 或 hashbang&#xff09;是脚本文件开头的前两个字符&#xff0c;用于告诉操作系统应该使用哪个解释器来执行该脚本。 核心作用&#xff1a; 指定解释器&#xff1a; 明确告诉系统运行这个脚本时应该调用哪个程序&#xff08;解释器&#xff09;来…

【大模型学习 | BERT 量化学习 (1)】

BERT 情感分析 一、 数据集加载与模型训练 from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset import torch import numpy as np from sklearn.metrics import accuracy_score mode_na…

用低通滤波优化串口或485 通信指示灯电路

常见的通信指示灯电路就是简单的把LED 连到TXD 和RXD 上&#xff0c;一有动静就闪一下。问题是&#xff0c;如果波特率很高&#xff0c;一次通信时间很短&#xff0c;相当于占空比很低&#xff0c;LED 闪烁的亮度就很弱&#xff0c;不容易观察。比如MODBUS 通信&#xff0c;波特…

【纯干货】调整word目录中的行距以及右对齐页码

1.问题展现 目录生成会遇到一些奇葩现象 所以到了展现技术力的时候了【doge】 2.解决word目录中的行距问题 选中目录中的文字-》段落 此时你可能勾选了图片中的一个以上&#xff0c;把他们都取消了&#xff0c; 由于一个目录的标题对应一个样式&#xff0c;第一个也可以取消 …

pandas 优雅处理值类型为list的列的csv读写问题

文章目录 直接存储join list 变成字符串存储json.dumps序列化存储以及json.loads反序列化读取总结 之所以分析这个问题,是因为读者在跟第三方数据供应商对接数据的时候,老是会遇到数据加载都会出错的问题,其中一个原因就是list类型数据没有正确储存,于是笔者在这篇文章里面详细…

一种解决 OpenWrt 安装 docker 之后局域网的设备之间无法互相访问通信的方法

文章目录 一、问题背景二、解决方案&#xff08;方法一&#xff09;修改全局设置的 转发&#xff08; forward&#xff09; 为 接受&#xff08;ACCEPT&#xff09;&#xff08;方法二&#xff09;设置 net.bridge.bridge-nf-call-iptables0 并将 docker 的容器网络设置为host …

Leetcode百题斩-贪心

贪心也是一个很有意思的专题&#xff0c;能遇到很多神奇的思路。 但这个专题&#xff0c;leetcode也没放Hard&#xff0c;果然是怕这种玄学专题上点难度大家罩不住。那就很快了&#xff0c;直接过 763. Partition Labels[Medium] 思路&#xff1a;将字母串分组&#xff0c;相…

基于多径信道的分集接收技术性能优化与仿真分析

基于多径信道的分集接收技术性能优化与仿真分析 一、多径信道建模与仿真 1. 多径信道建模(MATLAB实现) classdef MultipathChannel < handlepropertiesSampleRate = 1e6; % 采样率 (Hz)MaxDoppler = 100; % 最大多普勒频移 (Hz)DelayVector = [0

LeetCode 713.乘积小于K的子数组

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。 示例 1&#xff1a; 输入&#xff1a;nums [10,5,2,6], k 100 输出&#xff1a;8 解释&#xff1a;8 个乘积小于 100 的子数组分别为&#xff1a;[10]、[5…

打破网络安全孤岛:实现防御数据协作

作者&#xff1a;来自 Elastic Crossley McEwen, Oksana Abramovych 现代网络战场不再受组织边界的限制。在各类防御网络中&#xff0c;关键的结构化、非结构化和半结构化数据分布在不同的专业环境中&#xff0c;形成孤岛 —— 从机密情报系统到作战指挥平台&#xff0c;再到战…

给定一个没有重复元素的数组,写出生成这个数组的MaxTree的函数

题目&#xff1a; 给定一个没有重复元素的数组arr&#xff0c;写出生成这个数组的MaxTree的 函数&#xff0c;要求如果数组长度为N&#xff0c;则时间复杂度为O(N)、额外空间复杂度 为O(N)。 一个数组的MaxTree定义如下。 ● 数组必须没有重复元素。 ● MaxTree是一棵二叉…

iOS 抓包实战:时间戳偏差导致的数据同步异常排查记录

“这条数据不是我填的”“我的更新被覆盖了”“两个设备显示不一致”——这些是产品上线后最令人头疼的反馈。 最近我们在一次用户同步问题排查中&#xff0c;发现表面是“数据丢失”问题&#xff0c;实则是多端数据提交时间戳处理不一致&#xff0c;导致后台认为老数据为新&a…

一款支持多日志器、多级别、多落地方式的同异步日志系统

文章目录 简介项目特点项目实现基础功能模块实现文件操作以及日期时间获取日志等级日志信息描述 异步功能模块实现缓冲区实现异步线程实现 核心功能模块实现日志格式解析落地操作实现日志器实现 测试测试环境测试参数测试结果性能分析 附件 简介 在现代软件开发与系统运维领域…

加固笔记本在户外勘探行业的应用:探索与科技的融合

在自然资源勘探、地质调查、石油天然气开发、矿产资源测绘等户外勘探行业中&#xff0c;作业环境常常复杂多变&#xff1a;风沙漫天的戈壁、雨雪交加的山区、湿热潮湿的丛林&#xff0c;甚至是极寒与高温并存的极端气候条件。面对这些挑战&#xff0c;普通的办公设备早已无法胜…

MySQL 连接指定端口后,为什么实际仍是 3306?

文章目录 MySQL 连接指定端口后&#xff0c;为什么实际仍是 3306&#xff1f;问题现象复现原因分析没有指定 -h&#xff0c;默认走的是本地 Unix Socket多实例环境中未显式指定目标地址 正确的连接方法方法一&#xff1a;添加 -h 127.0.0.1方法二&#xff1a;添加 --protocolTC…

【Android当用户两次打断息屏操作后,屏幕将会在10分钟内无法熄灭并持续点亮(关闭Android13新增的dim功能)】

UndimDetectorWakeLock持锁导致屏幕不灭问题处理SOP 问题描述 在Android T版本中&#xff0c;系统新增了SCREEN_BRIGHT_WAKE_LOCK&#xff08;UndimDetectorWakeLock&#xff09;机制。当设备处于低亮度&#xff08;dim&#xff09;状态时&#xff0c;用户两次打断屏幕熄灭操…

Tailwind CSS自定义用法

文章目录 前言✅ 一、集成 Tailwind CSS 到 React 项目1. 安装依赖2. 配置 tailwind.config.js3. 创建全局样式文件&#xff08;如 src/index.css&#xff09;tailwind base;tailwind components;tailwind utilities; 4. 在 main.tsx 或 main.jsx 中引入样式 ✅ 二、自定义样式…