如何在 Java 8 中使用 Streams?结合多种案例剖析学习!

news2024/11/18 13:31:42

Java 8 Streams 是一个非常强大的功能,它提供了一种简洁、优雅的方式来处理数据集合。通过使用 Streams,我们可以轻松地过滤、映射、排序、聚合等操作数据。本教程将介绍 Streams 的基本概念,以及如何在 Java 8 中使用 Streams。本教程还包括许多代码示例,以帮助您更好地理解 Streams 的工作方式。

什么是 Streams?

在 Java 中,Stream 是一个用于操作集合元素的接口。它允许我们通过管道操作(Pipeline)来处理集合元素,从而实现过滤、排序、映射、聚合等操作。Stream 并不是一个集合,而是一个类似于 Iterator 的对象,它支持在集合上进行连续的操作。Stream 不改变原始的集合,而是在每次操作后返回一个新的 Stream 对象。

如何创建 Streams?

在 Java 8 中,可以使用 Collection.stream() 或 Collection.parallelStream() 方法来创建 Stream 对象。例如:

javaCopy codeList<String> list = Arrays.asList("one", "two", "three", "four", "five");

// 创建串行流
Stream<String> stream = list.stream();

// 创建并行流
Stream<String> parallelStream = list.parallelStream();

也可以使用 Stream.of() 方法来创建一个包含指定元素的 Stream 对象。例如:

javaCopy code
Stream<String> stream = Stream.of("one", "two", "three", "four", "five");

还可以使用 Stream.empty() 方法来创建一个空的 Stream 对象。例如:

javaCopy code
Stream<String> emptyStream = Stream.empty();

如何操作 Streams?

在 Java 8 中,Stream 提供了一系列方法来操作数据集合,包括中间操作和终止操作。中间操作会返回一个新的 Stream 对象,而终止操作会返回一个非 Stream 的结果。

中间操作

中间操作用于在 Stream 上进行连续的转换和过滤。以下是一些常见的中间操作:

  • filter:过滤符合条件的元素。
  • map:对元素进行转换操作。
  • flatMap:将一个 Stream 中的每个元素都转换成一个新的 Stream,然后将这些 Stream 连接起来形成一个新的 Stream。
  • distinct:去除重复元素。
  • sorted:对元素进行排序。
  • peek:对元素进行遍历操作,通常用于调试和打印日志。

以下是一些中间操作的示例:

javaCopy codeList<String> list = Arrays.asList("one", "two", "three", "four", "five");

// 过滤长度为3的字符串
Stream<String> stream = list.stream().filter(s -> s.length() == 3);

// 转换成大写
Stream<String> stream = list.stream().map(String::toUpperCase);

// 扁平化字符串列表
Stream<String> stream = list.stream().flatMap(s -> Stream.of(s.split(""));
// 去重
Stream<String> stream = list.stream().distinct();

// 排序
Stream<String> stream = list.stream().sorted();

// 遍历输出
list.stream().peek(System.out::println).count();

终止操作

终止操作用于在 Stream 上执行最终的操作,并返回非 Stream 的结果。以下是一些常见的终止操作:

  • forEach:对 Stream 中的每个元素执行操作。
  • count:返回 Stream 中元素的个数。
  • collect:将 Stream 中的元素转换成其他形式。
  • reduce:将 Stream 中的元素进行聚合操作。
  • min:返回 Stream 中的最小值。
  • max:返回 Stream 中的最大值。

以下是一些终止操作的示例:

List<String> list = Arrays.asList("one", "two", "three", "four", "five");

// 遍历输出
list.stream().forEach(System.out::println);

// 计算元素个数
long count = list.stream().count();

// 将元素转换成 List
List<String> newList = list.stream().collect(Collectors.toList());

// 求和
int sum = Stream.of(1, 2, 3, 4, 5).reduce(0, (a, b) -> a + b);

// 求最小值
int min = Stream.of(1, 2, 3, 4, 5).min(Integer::compareTo).get();

// 求最大值
int max = Stream.of(1, 2, 3, 4, 5).max(Integer::compareTo).get();

Streams 的并行处理

在 Java 8 中,Streams 提供了并行处理的功能,可以将集合分成多个部分进行处理,从而提高处理效率。要使用并行 Streams,只需要使用 Collection.parallelStream() 方法来创建一个并行的 Stream 对象即可。

以下是一个示例:

javaCopy codeList<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// 普通流处理
long start = System.currentTimeMillis();
int sum1 = list.stream().mapToInt(Integer::intValue).sum();
long end = System.currentTimeMillis();
System.out.println("串行流处理时间:" + (end - start) + "ms");

// 并行流处理
start = System.currentTimeMillis();
int sum2 = list.parallelStream().mapToInt(Integer::intValue).sum();
end = System.currentTimeMillis();
System.out.println("并行流处理时间:" + (end - start) + "ms");

System.out.println("串行流结果:" + sum1);
System.out.println("并行流结果:" + sum2);

输出结果:

Copy code串行流处理时间:2ms
并行流处理时间:1ms
串行流结果:55
并行流结果:55

总结

Java 8 Streams 是一个非常强大的功能,它提供了一种简洁、优雅的方式来处理数据集合。本教程介绍了 Streams 的基本概念,以及如何在 Java 8 中使用 Streams。同时,本教程也包含了许多代码示例,以帮助读者更好地理解和应用 Streams。

在使用 Streams 时,需要注意以下几点:

  1. 尽量避免在 Stream 中执行过多的计算,因为这会影响性能。
  2. 在使用并行流处理时,要注意线程安全问题。
  3. 不要试图在同一个 Stream 对象上执行多次终止操作,因为这会导致 IllegalStateException 异常。
  4. 在使用 collect 操作时,可以使用 Collectors 工具类提供的方法,例如 toList、toSet 等,以方便地将元素转换成其他形式。

总的来说,Java 8 Streams 是一个非常强大、灵活的功能,它可以帮助我们更加高效地处理数据集合。如果你还没有尝试过 Streams,希望本教程能够帮助你入门,并掌握其基本用法。

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

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

相关文章

【计算机视觉 | 语义分割】OVSeg:分割一切后,SAM又能分辨类别了,Meta/UTAustin提出全新开放类分割模型

文章目录 一、前言二、研究背景三、论文解读3.1 动机3.2 方法3.3 结果 一、前言 前几日&#xff0c;Meta 推出了「分割一切」AI 模型 Segment Anything&#xff0c;令网友直呼 CV 不存在了&#xff1f;&#xff01; 而在另一篇被 CVPR 2023 收录的论文中&#xff0c;Meta、UT…

《计算机网络——自顶向下方法》精炼——2.2.3-2.2.5

文章目录 引言正文HTTP报文请求行首部行实体体其他方法 HTTP响应报文实体体和初始状态行首部行 cookiecookie的运行过程Web缓存条件GET方法 引言 计算机网络在这一学科中的重要性毋庸置疑&#xff0c;而黑皮书又是这一学科的教科书级经典&#xff0c;因此本书是计算机从业者的…

微服务学习之面试知识相关总结(Redis)

文章目录 前言Redis常见面试知识1 Redis与Memcache的区别2 Redis的单线程问题3 Redis的持久化方案3.1 基础知识3.2 面试话术 4 Redis的集群方式4 Redis的常用数据类型5 Redis事务机制6 Redis的Key过期策略6.1 过期删除策略6.2 内存淘汰策略6.3 面试话术&#xff1a; 7 Redis在项…

SpringBoot(7)消息处理

消息处理 消息Java处理消息的标准规范JMSAMQPMQTTkafka 案例准备整合ActiveMQ整合RabbitMQ整合RocketMQ整合Kafka 消息 对于消息的生产者与消费者的工作模式&#xff0c;还可以将消息划分成两种模式&#xff0c;同步消费与异步消息。 同步消息就是生产者发送完消息&#xff0…

SpringCloud入门实战(七)-Hystrix服务降级入门案例

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术&#xff0c;都可以先去官网先看看&…

广州华锐互动:AR远程协作系统为电力设备状态监测提供有力支持

电力设备是电网运行的重要组成部分&#xff0c;对电网的安全稳定运行具有至关重要的作用。在电力设备状态监测中&#xff0c;如何快速、准确地诊断和解决设备故障&#xff0c;是电力企业和电力设备维护人员需要面对的重要问题。 广州华锐互动将AR增强现实技术运用到电力设备维…

美颜sdk是什么?探索美颜sdk的技术内幕

目前&#xff0c;美颜sdk作为美颜功能的实现方式&#xff0c;已经成为了各大应用开发者的热门选择之一。那么&#xff0c;美颜sdk到底是什么&#xff1f;它的技术内幕又是怎样的呢&#xff1f;本文将会为您揭开它的神秘面纱。 一、美颜sdk简述 美颜sdk顾名思义&#xff0c;就…

瑞萨开发环境搭建

使用keil环境&#xff0c;开发瑞萨renase A4M2 下载MDK 下载MDK&#xff0c;5.37 其它版本 最好使用5.30以上 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5k3XGSK5-1682182139410)(https://secure2.wostatic.cn/static/reEunrWa2vsfrcpVZC1nbo…

关于存储那些事1-----基础篇

目录 一、SSD1、简介1.1 分类1.1.1 易失性存储器1.1.2 非易失性存储器 2、SSD接口2.1 SATA接口2.2 SATA Express接口2.3 SAS接口2.4 U.2接口2.5 mSATA接口2.6 M.2接口2.7 PCI-E接口 二、闪存&#xff08;Flash memory&#xff09;1、简介1.1 NOR Flash1.2 NAND Falsh1.3 NOR Fl…

二维码图片生成工具C#winform源码

二维码图片生成工具C#winform源码 源码描述&#xff1a; 一、源码特点 采用winform进行开发,生成二维码并保存&#xff0c;欢迎下载 二、功能介绍 本源码是一个可以自动生成二维码图片的小模块&#xff0c;可以添加自己的logo图片&#xff0c;可以保存在自己想要保存的地方 …

ubuntu20.04+x86_64+virtualbox6.7 环境下编译xenomai内核和实时性测试[详解]

下面是针对实时系统Xenomai使用的一些记录,实时系统在工业自动化,机器人等智能行业是必需会用到的。 简述 xenomai是众多inux实时性解决方案中的一种,通过在linux的基础上添加一个RTOS内核cobalt,来提高linux的实时性。实时内核cobalt与非实时内核linux相结合,既能提供工…

C/C++笔记-写一个Makefile并链接QtCore库使用QString,QDebug

如下cpp代码&#xff0c;调用QDebug打印程序&#xff1a; #include <QDebug> #include <QString>int main(int argc, char *argv[]){QString testStr "hello";qDebug() << testStr;return 0; } 如下makefile&#xff1a; test: main.cppg -c -…

‘gulp‘ 不是内部或外部命令,也不是可运行的程序

出现问题&#xff1a; D:\git\renwey-web-mobile>gulp default gulp 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 两种原因 原因一&#xff1a;环境变量没有设置 原因二&#xff1a;没有安装全局的gulp&#xff0c;只安装了本地gulp&#xff0c;…

CTFShow-Web篇详细wp

CTFShow-Web篇详细wp web签到题web2web3web4web5web6web7web8 CTFShow 平台&#xff1a;https://ctf.show/ web签到题 直接F12然后Base64解码 ctfshow{19bdf375-f974-481e-8c62-0f4c3d170fb4} web2 考点&#xff1a;联合查询 先尝试使用万能密码登入 ‘ or 11# 登入成功&am…

NFS共享服务

文章目录 1.NFS1.1 NFS简介1.2 RPC简介1.3 NFS网络文件系统1.4 NFS应用场景1.5 NFS通讯原理 2.NFS配置 1.NFS 1.1 NFS简介 NFS&#xff08;Network File System&#xff09;即网络文件系统&#xff0c;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机之间通…

产品的技术加油站

作为产品经理的你&#xff0c;每次被喷不懂技术的时候&#xff0c;是否也曾想过暗暗发力&#xff0c;恶补一波技术&#xff0c;然后惊艳所有人&#xff1f;但冷静之后&#xff0c;又觉得无从下手&#xff1f; 是不是还想过要不要学习一下编程&#xff1f;然后被人推荐了什么py…

【致敬未来的攻城狮计划】— 连续打卡第十天:FSP固件库开发及FSP配置详解。

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

Gnuplot绘图入门2——根据多列文本数据绘制图形

Gnuplot绘图入门2——根据多列文本数据绘制图形 Gnuplot绘图入门1以绘制sin(x)的函数图形为例&#xff0c;对Gnuplot进行了简要介绍。这个教程将介绍如何使用Gnuplot对保存在文本文件&#xff08;.txt、.dat文件&#xff09;中的数据进行可视化。 将下面的数据复制下了&#…

Python高光谱遥感数据处理与机器学习实践技术

目录 第一章 高光谱基础 第二章 高光谱开发基础&#xff08;Python&#xff09; 第三章 高光谱机器学习技术&#xff08;python&#xff09; 第四章 典型案例操作实践 总结了高光谱遥感技术领域的基础原理与核心概念&#xff0c;采用编程语言复现经典数据处理和应用方法&am…

OpenHarmony应用开发-ArkUI方舟开发框架简析

方舟开发框架&#xff08;简称ArkUI&#xff09;为OpenHarmony应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界…