java8 Stream流详解
前言
Java 8引入了一种新的处理集合的方式——Stream API。它提供了一种高级迭代方式,支持函数式编程风格,使得集合操作更加简洁、清晰。本文将详细介绍Java 8 Stream API的核心概念、操作和使用技巧。
Stream API 简介
Stream API是Java 8中的一大亮点,它允许你以声明式方式处理数据集合。Stream API的主要目标是提供一种高效、可组合的方式来处理数据集合。
基本概念
Stream:代表数据序列,可以是集合、数组或其他数据源。
Pipeline:由多个操作步骤组成的流水线,每个步骤都是惰性求值的。
Intermediate Operations:中间操作,返回一个新的流,可以进行多个中间操作。
Terminal Operations:终止操作,返回一个非流结果,如一个值或void。
实践
创建Stream
从集合或数组:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
从值:
Stream<String> stream = Stream.of("a", "b", "c");
从文件:
try (Stream<String> lines = Files.lines(Paths.get("file.txt"), StandardCharsets.UTF_8)) {lines.forEach(System.out::println);
}
Intermediate Operations(中间操作)
filter:过滤元素
stream.filter(s -> s.startsWith("a")).forEach(System.out::println);
map:转换元素
stream.map(String::toUpperCase).forEach(System.out::println);
flatMap:将流中的每个元素转换为另一个流,然后将它们连接起来。
Stream<List<String>> streamOfStream = Stream.of(Arrays.asList("a", "b"), Arrays.asList("c", "d"));
streamOfStream.flatMap(List::stream).forEach(System.out::println);
利用peek进行调试
peek允许你在流的流水线中执行一个副作用操作,比如打印元素、记录日志或进行调试。peek操作不会改变流中的元素,它主要用于调试或监控流的操作。
调试流操作:
list.stream().peek(e -> System.out.println("Processing: " + e)).filter(s -> s.startsWith("a")).collect(Collectors.toList());
利用distinct去重
distinct操作可以快速从流中去除重复元素。
去除重复元素:
List<String> uniqueElements = list.stream().distinct().collect(Collectors.toList());
利用sorted进行排序
sorted操作可以对流中的元素进行排序。
排序流:
List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList());
limit:限制流中元素的数量。
stream.limit(10);
Terminal Operations (终止操作)
forEach:对每个元素执行操作
stream.forEach(System.out::println);
collect:将流转换为其他形式
List<String> result = stream.collect(Collectors.toList());
reduce:通过某个连接动作将所有元素汇总成一个汇总结果
Optional<String> reduced = stream.reduce((s1, s2) -> s1 + s2);
allMatch、anyMatch、noneMatch:检查流中的元素是否与给定的谓词匹配
boolean allUpperCase = stream.allMatch(s -> s.toUpperCase().equals(s));
count: 返回流中元素的数量。
long count = stream.count();
findFirst、findAny:返回流中的第一个元素或任意一个元素。
Optional<String> first = stream.findFirst();
toArray:
将流元素转换为数组。
String[] array = stream.toArray(String[]::new);
min、max:返回流中最小或最大的元素。
Optional<String> min = stream.min(Comparator.naturalOrder());
iterate:
迭代流,直到满足终止条件。
Stream<Integer> iterate = Stream.iterate(0, n -> n + 1).limit(10);
并行流
Stream API还支持并行操作,可以利用多核处理器提高性能。
long count = list.parallelStream().filter(s -> s.startsWith("a")).count();
注意事项
惰性求值:Stream操作是惰性求值的,即只有在执行终止操作时才会执行。
不可变性:Stream操作通常会产生一个新的流,而不是修改原始流。
流的消耗:一旦流经过终止操作,它就不能再被使用。如果你需要再次使用流,需要重新创建流。
性能考虑:某些终止操作可能会对性能产生影响,尤其是在处理大数据集时。
副作用:在流操作中应谨慎使用有副作用的操作。某些终止操作可能会产生副作用,如修改外部状态或执行I/O操作。
并行流:在并行流上使用终止操作时,需要注意线程安全和数据一致性。
总结
Java 8的Stream API为集合处理提供了一种强大、灵活且表达性强的方式。通过掌握Stream API,你可以编写更简洁、更高效的代码。
good day!!!
相关文章:
java8 Stream流详解
前言 Java 8引入了一种新的处理集合的方式——Stream API。它提供了一种高级迭代方式,支持函数式编程风格,使得集合操作更加简洁、清晰。本文将详细介绍Java 8 Stream API的核心概念、操作和使用技巧。 Stream API 简介 Stream API是Java 8中的一大亮…...
通信工程学习:什么是AB地址总线、DB数据总线、CD控制总线
AB地址总线、DB数据总线、CD控制总线 在计算机体系结构中,总线(Bus)是一种用于在计算机内部各个组件之间传输信息的物理通道。其中,AB地址总线、DB数据总线和CD控制总线是计算机总线系统中非常重要的三个组成部分,它们…...
CP AUTOSAR标准之EthernetInterface(AUTOSAR_SWS_EthernetInterface)(更新中……)
1 简介和功能概述 该规范指定了AUTOSAR基础软件模块以太网接口的功能、API和配置。 在AUTOSAR分层软件架构[1]中,以太网接口属于ECU抽象层,或者更准确地说,属于通信硬件抽象。 这表明了以太网接口的主要任务: 为上层提供独立于硬件的以太网通信系统接口,该系统…...
Windows系统离线安装使用pm2 管理进程
目录 1. 安装 Node.js 和 npm 2. 创建一个项目目录 3. 初始化 npm 项目 4. 下载 pm2 及其所有依赖 5. 打包 pm2 及其依赖 6. 将打包文件传输到内网服务器 7. 在内网服务器上解压并安装 8. 使用 pm2 总结 在联网的机器上,使用 npm(Node.js 包管理…...
4-4.Andorid Camera 之简化编码模板(获取摄像头 ID、选择最优预览尺寸)
一、Camera 简化思路 在 Camera 的开发中,其实我们通常只关注打开相机、图像预览和关闭相机,其他的步骤我们不应该花费太多的精力 为此,应该提供一个工具类,它有处理相机的一些基本工具方法,包括获取摄像头 ID、选择最…...
【深度学习】向量化
1. 什么是向量化 向量化通常是消除代码中显示for循环语句的技巧,在深度学习实际应用中,可能会遇到大量的训练数据,因为深度学习算法往往在这种情况下表现更好,所以代码的运行速度非常重要,否则如果它运行在一个大的数据…...
基于canal的Redis缓存双写
canal地址:alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com)https://github.com/alibaba/canal 1. 准备 1.1 MySQL 查看主机二进制日志 show master status 查看binlog是否开启 show variables like log_bin 授权canal连接MySQL账号 …...
以太网交换机工作原理学习笔记
在网络中传输数据时需要遵循一些标准,以太网协议定义了数据帧在以太网上的传输标准,了解以太网协议是充分理解数据链路层通信的基础。以太网交换机是实现数据链路层通信的主要设备,了解以太网交换机的工作原理也是十分必要的。 1、以太网协议…...
ECCV`24 | 蚂蚁集团开源风格控制新SOTA!StyleTokenizer:零样本精确控制图像生成
文章链接:https://arxiv.org/pdf/2409.02543 代码&数据集链接: https://github.com/alipay/style-tokenizer 亮点直击 介绍了一种名为StyleTokenizer的新方法,用于在扩散模型中进行风格控制。这种方法允许通过一个任意参考图像实现对生成…...
Flutter的升级和降级步骤
升级 1.版本升级 // 升级到指定版本 flutter upgrade 版本号 // 升级到最新版本 flutter upgrade 2. 更新开发配置 启动 Android Studio。 打开 Settings 对话框,查看 SDK Manager。 如果你已经打开了一个项目,请打开 Tools > SDK Manager。 如果…...
计算机网络与Internet应用
一、计算机网络 1.计算机网络的定义 网络定义:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享…...
[建模已更新]2024数学建模国赛高教社杯A题:“板凳龙” 闹元宵 思路代码文章助攻手把手保姆级
本系列专栏将包括两大块内容 第一块赛前真题和模型教学,包括至少8次真题实战教学,每期教学专栏的最底部会提供完整的资料百度网盘包括:真题、数据、可复现代码以及文章. 第二块包括赛中详细思路建模、代码的参考助攻, 会提供2024年高教社国赛A的全套参考内容(一般36h内更新完毕…...
Spring Boot-自定义banner
在 Spring Boot 应用中,你可以自定义启动时显示的 banner。这些 banner 可以包括图形、文字或者其他形式的标识。如图所示: 1. 使用 banner.txt 文件 默认情况下,Spring Boot 使用项目的 banner.txt 文件中的内容作为启动时的 banner。你可以…...
2158. 直播获奖(live)
代码 #include<bits/stdc.h> using namespace std; int main() {int n,w,a[100000],cnt[601]{0},i,j,s;cin>>n>>w;for(i0;i<n;i){scanf("%d",&a[i]);cnt[a[i]];int x(i1)*w/100;if(!x) x1;for(j600,s0;j>0;j--){scnt[j];if(s>x){cou…...
python---爬取QQ音乐
如Cookie为非vip,仅能获取非vip歌曲 1.下载包 pip install jsonpath 2.代码 import os import time import requests from jsonpath import jsonpathdef search_and_download_qq_music(query_text):headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; …...
tomato靶场攻略
1.使用nmap扫描同网段的端口,发现靶机地址 2.访问到主页面,只能看到一个大西红柿 3.再来使用dirb扫面以下有那些目录,发现有一个antibot_image 4.访问我们扫到的地址 ,点金目录里看看有些什么文件 5.看到info.php很熟悉࿰…...
Django+Vue3前后端分离学习(一)(项目开始时settings.py里的设置)
一、创建django项目 二、修改settings.py里的配置: 1、修改语言和时区: # 语言编码 LANGUAGE_CODE zh-hansTIME_ZONE UTCUSE_I18N True# 不用时区 USE_TZ False 2、配置数据库: DATABASES {default: {ENGINE: django.db.backends.m…...
一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)
1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear[&q…...
C++ | Leetcode C++题解之第394题字符串解码
题目: 题解: class Solution { public:string src; size_t ptr;int getDigits() {int ret 0;while (ptr < src.size() && isdigit(src[ptr])) {ret ret * 10 src[ptr] - 0;}return ret;}string getString() {if (ptr src.size() || src[…...
getLocation:fail, the permission value is offline verifying
getLocation:fail, the permission value is offline verifying 后端会根据appid和secret生成 签名,前端wx配置时一定用appid来验证签名的正确 本次错误为配置初始化失败:前端与后端的appId不一致,我的失误也...
Steane编码实战指南:用Python模拟[7,1,3]量子纠错电路(附完整代码)
Steane编码实战指南:用Python模拟[7,1,3]量子纠错电路(附完整代码) 量子计算正从实验室走向现实应用,但量子比特的脆弱性始终是横亘在实用化道路上的关键障碍。想象一下,当你精心设计的量子算法因为一个随机的相位翻转…...
快速验证openclaw抓取能力:用快马一键生成部署原型
最近在做一个内容抓取的小项目,尝试用openclaw框架快速搭建原型。这个开源机器人框架功能强大,但配置起来确实有点麻烦,特别是环境依赖和部署环节。经过一番折腾,我发现用InsCode(快马)平台可以省去很多重复劳动,分享下…...
深度学习特征分解、SVD 与 PCA —— 矩阵的“质因数分解“(六)
1. 定位导航 本篇是第2章线性代数的终篇,覆盖三个最有力的矩阵分析工具:特征分解、奇异值分解(SVD)、主成分分析(PCA)。此外还包括三个辅助工具:Moore-Penrose 伪逆、迹运算、行列式。 这些工具贯穿深度学习的方方面面——PCA 用于数据预处理和降维,SVD 用于模型压缩…...
剪映高级感文字动画素材合集 预设+教程全整理
平时做口播视频时,总觉得文字动画的精致度跟不上内容节奏,找适配的素材又要花不少时间,所以最近整理了一份剪映高级感口播动态文字动画素材合集,涵盖预设、教程和配套排查资料,今天分享给有同样需求的朋友。 一、素材合…...
LeaguePrank终极指南:免费打造个性化英雄联盟界面体验
LeaguePrank终极指南:免费打造个性化英雄联盟界面体验 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 还在为英雄联盟千篇一律的客户端界面感到乏味吗?LeaguePrank这款免费开源工具让你轻松自定义游戏中…...
Vector API + Panama Foreign Function最新融合实践(2024 Q2实测):纯Java实现BLAS级矩阵运算
第一章:Vector API Panama Foreign Function融合背景与技术演进Java 平台长期面临两大性能瓶颈:一是 JVM 对现代 CPU 向量化指令(如 AVX-512、SVE)缺乏直接、安全、可移植的抽象;二是 Java 与本地系统库(如…...
收藏!小白也能入局:2026年最火高薪AI Agent开发指南(年薪80万+)
文章介绍了Agentic AI(AI Agent)的兴起及其对职场的巨大影响。通过一个真实案例展现了个人通过学习AI从月薪8K到年薪80万的转变。文章指出,到2026年,40%的岗位将与AI Agent协作,年薪10万美元起步的职位需求激增。文章详…...
Qwen3-Embedding-4B GPU算力优化:CUDA Stream并发执行向量化与相似度计算,吞吐提升1.8倍
Qwen3-Embedding-4B GPU算力优化:CUDA Stream并发执行向量化与相似度计算,吞吐提升1.8倍 1. 引言:当语义搜索遇上性能瓶颈 想象一下,你正在使用一个智能语义搜索工具,输入“我想吃点东西”,它立刻为你找到…...
intv_ai_mk11步骤详解:从curl验证到浏览器交互,完整闭环操作演示
intv_ai_mk11步骤详解:从curl验证到浏览器交互,完整闭环操作演示 1. 模型概述与核心能力 intv_ai_mk11是基于Llama架构的中等规模文本生成模型,专为通用文本处理任务优化。这个开箱即用的解决方案特别适合以下场景: 智能问答系…...
Wan2.2-I2V-A14B部署教程:混合云架构下边缘节点视频生成能力下沉
Wan2.2-I2V-A14B部署教程:混合云架构下边缘节点视频生成能力下沉 1. 镜像概述与核心价值 Wan2.2-I2V-A14B私有部署镜像是一款专为文生视频场景优化的解决方案,特别适合需要在边缘节点部署视频生成能力的企业用户。这个镜像最大的特点是"开箱即用&…...
