Java Stream 全面解析

Java Stream 全面解析

Java 8 引入的 Stream API 提供了一种高效且声明式的方式来处理集合数据。Stream 允许你以函数式编程风格操作数据,支持并行处理,并且可以显著简化代码。下面我们将从 创建操作中间操作终端操作 三个方面进行全面深入的解析,并给出代码示例。


1. 创建操作

创建 Stream 的方式有多种,以下是常见的创建方式:

1.1 从集合创建
List<String> list = Arrays.asList("apple", "banana", "cherry");
Stream<String> streamFromList = list.stream();
1.2 从数组创建
String[] array = {"apple", "banana", "cherry"};
Stream<String> streamFromArray = Arrays.stream(array);
1.3 使用 Stream.of
Stream<String> streamOf = Stream.of("apple", "banana", "cherry");
1.4 使用 Stream.iterate
Stream<Integer> streamIterate = Stream.iterate(0, n -> n + 2).limit(5); // 0, 2, 4, 6, 8
1.5 使用 Stream.generate
Stream<Double> streamGenerate = Stream.generate(Math::random).limit(5); // 5个随机数
1.6 使用 Files.lines 从文件创建
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

Stream<String> lines = Files.lines(Paths.get("file.txt")); // 从文件中读取行

2. 中间操作

中间操作返回一个新的 Stream,可以链式调用。常见的中间操作包括:

2.1 filter

过滤流中的元素。

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
List<String> filteredList = list.stream()
                                .filter(s -> s.length() > 5)
                                .collect(Collectors.toList());
System.out.println(filteredList); // [banana, cherry]
2.2 map

将流中的每个元素映射为另一个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry");
List<Integer> lengths = list.stream()
                            .map(String::length)
                            .collect(Collectors.toList());
System.out.println(lengths); // [5, 6, 6]
2.3 flatMap

将流中的每个元素映射为一个流,然后将所有流合并为一个流。

List<List<String>> nestedList = Arrays.asList(
    Arrays.asList("apple", "banana"),
    Arrays.asList("cherry", "date")
);
List<String> flatList = nestedList.stream()
                                  .flatMap(List::stream)
                                  .collect(Collectors.toList());
System.out.println(flatList); // [apple, banana, cherry, date]
2.4 sorted

对流中的元素进行排序。

List<String> list = Arrays.asList("banana", "apple", "cherry");
List<String> sortedList = list.stream()
                              .sorted()
                              .collect(Collectors.toList());
System.out.println(sortedList); // [apple, banana, cherry]
2.5 distinct

去除流中的重复元素。

List<String> list = Arrays.asList("apple", "banana", "apple", "cherry");
List<String> distinctList = list.stream()
                                .distinct()
                                .collect(Collectors.toList());
System.out.println(distinctList); // [apple, banana, cherry]
2.6 limit

截取流中的前 N 个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
List<String> limitedList = list.stream()
                               .limit(2)
                               .collect(Collectors.toList());
System.out.println(limitedList); // [apple, banana]
2.7 skip

跳过流中的前 N 个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
List<String> skippedList = list.stream()
                               .skip(2)
                               .collect(Collectors.toList());
System.out.println(skippedList); // [cherry, date]

3. 终端操作

终端操作触发流的执行并产生结果或副作用。常见的终端操作包括:

3.1 forEach

遍历流中的每个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry");
list.stream().forEach(System.out::println); // apple, banana, cherry
3.2 collect

将流中的元素收集到集合或其他数据结构中。

List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> collectedList = list.stream().collect(Collectors.toList());
System.out.println(collectedList); // [apple, banana, cherry]
3.3 reduce

将流中的元素通过某种操作组合起来。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream().reduce(Integer::sum);
sum.ifPresent(System.out::println); // 15
3.4 count

计算流中元素的数量。

List<String> list = Arrays.asList("apple", "banana", "cherry");
long count = list.stream().count();
System.out.println(count); // 3
3.5 anyMatch

检查流中是否有任意一个元素满足条件。

List<String> list = Arrays.asList("apple", "banana", "cherry");
boolean anyMatch = list.stream().anyMatch(s -> s.startsWith("b"));
System.out.println(anyMatch); // true
3.6 allMatch

检查流中是否所有元素都满足条件。

List<String> list = Arrays.asList("apple", "banana", "cherry");
boolean allMatch = list.stream().allMatch(s -> s.length() > 3);
System.out.println(allMatch); // true
3.7 noneMatch

检查流中是否没有元素满足条件。

List<String> list = Arrays.asList("apple", "banana", "cherry");
boolean noneMatch = list.stream().noneMatch(s -> s.startsWith("z"));
System.out.println(noneMatch); // true
3.8 findFirst

返回流中的第一个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry");
Optional<String> firstElement = list.stream().findFirst();
firstElement.ifPresent(System.out::println); // apple
3.9 findAny

返回流中的任意一个元素(通常在并行流中使用)。

List<String> list = Arrays.asList("apple", "banana", "cherry");
Optional<String> anyElement = list.stream().findAny();
anyElement.ifPresent(System.out::println); // 可能是 apple, banana, cherry
3.10 minmax

返回流中的最小或最大元素。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> min = numbers.stream().min(Integer::compareTo);
Optional<Integer> max = numbers.stream().max(Integer::compareTo);
min.ifPresent(System.out::println); // 1
max.ifPresent(System.out::println); // 5
3.11 toArray

将流中的元素转换为数组。

List<String> list = Arrays.asList("apple", "banana", "cherry");
String[] array = list.stream().toArray(String[]::new);
System.out.println(Arrays.toString(array)); // [apple, banana, cherry]

4. 并行流

通过 parallelStream() 可以轻松实现并行处理,提高性能。

List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
list.parallelStream().forEach(System.out::println); // 并行处理

总结

Java Stream 提供了丰富的操作,包括 创建操作中间操作终端操作。通过熟练掌握这些操作,你可以编写出简洁、高效且易于维护的代码。以下是关键点:

  • 创建操作:如 stream(), Stream.of, Stream.iterate, Stream.generate 等。
  • 中间操作:如 filter, map, flatMap, sorted, distinct, limit, skip 等。
  • 终端操作:如 forEach, collect, reduce, count, anyMatch, allMatch, noneMatch, findFirst, findAny, min, max, toArray 等。

希望这些内容能帮助你全面掌握 Java Stream!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新一代SCADA: 宏集Panorama Suite 2025 正式发布,提供更灵活、符合人体工学且安全的应用体验

宏集科技宣布正式推出全新Panorama Suite 2025 SCADA软件&#xff01;全新版本标志着 Panorama Suite的一个重要里程碑&#xff0c;代表了从 Panorama Suite 2022 开始并跨越三个版本&#xff08;2022、2023、2025&#xff09;的开发过程的顶峰。 此次重大发布集中在六个核心主…

PAT乙级真题 — 1080 MOOC期终成绩(java)【测试点3超时】

对于在中国大学MOOC&#xff08;http://www.icourse163.org/ &#xff09;学习“数据结构”课程的学生&#xff0c;想要获得一张合格证书&#xff0c;必须首先获得不少于200分的在线编程作业分&#xff0c;然后总评获得不少于60分&#xff08;满分100&#xff09;。总评成绩的计…

【Oracle篇】浅谈执行计划中的多表连接(含内连接、外连接、半连接、反连接、笛卡尔连接五种连接方式和嵌套、哈希、排序合并三种连接算法)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…

TCP 端口号为何位于首部前四个字节?协议设计的智慧与启示

知乎的一个问题很有意思&#xff1a;“为什么在TCP首部中要把TCP的端口号放入最开始的四个字节&#xff1f;” 这种问题很适合我这种搞历史的人&#xff0c;大年初一我给出了一个简短的解释&#xff0c;但仔细探究这个问题&#xff0c;我们将会获得 TCP/IP 被定义的过程。 文…

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用&#xff1a;1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织&#xff08;合并/删除&#xff09; oracle表分区…

蓝桥杯(B组)-每日一题(求最大公约数最小公倍数)

题目&#xff1a; 代码展现&#xff1a; #include<iostream> using namespace std; int main() {int m,n,x,y;cin>>m>>n;//输入两个整数int b;bm%n;//取余数xm;//赋值yn;while(b)//当余数不为0的时候{xy;//辗转相除求最小公约数yb;bx%y;}cout<<y<&…

基于STM32的学习环境控制系统设计

&#x1f91e;&#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是学习环境控制。 设备的详细功能见网盘中的文章《21、基于STM32的学习环境控制系统设计》&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1uWSZX2zbZwy9sY…

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章&#xff1a;3.React 组件化开发React官方并没有给出在React中统一的样式风格&#xff1a; 由此&#xff0c;从普通的css&#xff0c;到css modules&#xff0c;再到css in js&#xff0c;有几十种不同的解决方案&#xff0c;上百…

Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题&#xff0c;今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中&#xff0c;单服同时在线一般都会有几千人。当有个玩家执行一个操作&#xff0c;理想情况下要把玩家的操作广播同步给单…

w~大模型~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/13284996 #VideoMamba 视频理解因大量时空冗余和复杂时空依赖&#xff0c;同时克服两个问题难度巨大&#xff0c;CNN 和 Transformer 及 Uniformer 都难以胜任&#xff0c;Mamba 是个好思路&#xff0c;让我们看看本文是…

【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景

文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先&#xff0c;新建一个空的文件夹&#xff0c;然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…

Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)

一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架&#xff0c;可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序&#xff0c;比如 控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代…

PostgreSQL 开发利器:Navicat 核心功能与资源攻略

近几年&#xff0c;&#x1f418; PostgreSQL 在全球数据库排名中表现优异。在 2025 年 2 月 DB-Engines 排名中 (如图)&#xff0c;PostgreSQL 稳居第四名&#xff0c;并逐渐逼近第三名的 Microsoft SQL Server&#xff0c;其评分和受欢迎度持续增长&#xff0c;成为开源数据库…

大模型数据集全面整理:444个数据集下载地址

本文针对Datasets for Large Language Models: A Comprehensive Survey 中的 444 个数据集&#xff08;涵盖8种语言类别和32个领域&#xff09;进行完整下载地址整理收集。 2024-02-28&#xff0c;由杨刘、曹家欢、刘崇宇、丁凯、金连文等作者编写&#xff0c;深入探讨了大型语…

【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库

文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…

修改docker内容器中的某配置文件的命令

先找到配置文件config.php find / -name "config.php" 2>/dev/null 然后用vi编辑器修改配置文件 vi /var/www/config.php 最后就是vi的基本操作&#xff0c;根据具体需求使用&#xff1a; vi 有两种主要模式&#xff1a; 命令模式&#xff1a;进入 vi 后的默认…

23.[前端开发]Day23-移动端适配方案-考拉海购移动端项目

01-05 移动端适配rem方案 适配方案 – rem动态html的font-size rem的font-size尺寸 方式一&#xff1a;动态font-size-媒体查询 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…

数据中心网络监控

数据中心是全球协作的特定设备网络&#xff0c;用来在internet网络基础设施上传递、加速、展示、计算、存储数据信息。 对于任何利用IT基础设施的企业来说&#xff0c;数据中心都是运营的核心&#xff0c;它本质上为整个业务网络托管业务应用程序和存储空间。数据中心可以是任…

网络初识-

网络的相关概念 一、局域网和广域网 将各种计算机、外部设备等相互连接起来&#xff0c;实现在这个范围内数据通信和资源共享的计算机网络。它的覆盖范围通常在几百米到几公里之内。例如&#xff0c;一个小型企业的办公室&#xff0c;通过交换机将多台电脑连接在一起&#xf…