说说Java 8 引入的Stream API

devtools/2024/10/18 5:40:39/

介绍背景

Stream API,这是一种高效、易于使用的数据处理方式,它可以极大提高程序员对集合数据操作的效率和便利性。

1. Stream的基本概念 

Java Stream是一种数据流,它可以用于对集合、数组或者其他支持的数据源进行批量操作。它不是数据结构,不存储数据,而是提供了对数据进行计算的各种操作。流的操作分为中间操作(Intermediate Operations)和终端操作(Terminal Operations)。中间操作不会执行任何处理,直到遇到终端操作才会开始处理并得出最终结果。

2. 创建Stream 

可以通过Collection系列接口的stream()或parallelStream()方法从集合创建Stream,也可以使用Arrays.stream()方法从数组创建Stream。

java">List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();

3. 中间操作 

中间操作如filter(), map(), sorted()等,它们会返回一个新的Stream,不会改变原有的Stream。

java">// 筛选出大于3的数
Stream<Integer> filteredStream = list.stream().filter(i -> i > 3);

4. 终端操作 

终端操作如forEach(), collect(), count(), findFirst()等,它们会触发流的计算并得出结果或者消费掉流。一旦执行了终端操作,Stream就无法再被使用。

java">// 打印出所有大于3的数
list.stream().filter(i -> i > 3).forEach(System.out::println);// 计算大于3的数的数量
long count = list.stream().filter(i -> i > 3).count();

5. 聚合操作 

collect()是一个常见的终端操作,常用于将流转换为集合、数组或其他形式的结果。

java">// 将大于3的数收集到新的List中
List<Integer> newlist = list.stream().filter(i -> i > 3).collect(Collectors.toList());

6. 并行流 

Java 8还引入了并行流(Parallel Streams),可以在多核处理器上充分利用硬件资源,提高处理大数据集时的性能。

java">// 使用并行流统计所有大于3的数
long parallelCount = list.parallelStream().filter(i -> i > 3).count();

并行流的使用方法和串行流基本相同,只需要在流的创建时通过 parallel() 方法将串行流转换为并行流即可,在并行流操作中,需要注意以下几点:

  • 线程安全性:并行流的操作是线程安全的,不需要程序员显式地进行同步操作。
  • 适用性:并行流适用于数据量较大、处理时间较长的情况,可以充分利用多核处理器的性能优势。
  • 性能考量:尽管并行流可以加速处理过程,但在某些情况下并行流的性能可能会比串行流更差,特别是在数据量较小或者操作过程中存在大量的同步开销时。因此,需要根据实际情况评估是否使用并行流操作。

http://www.ppmy.cn/devtools/7058.html

相关文章

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、小程序、Uniapp、标准Java平台&#xff0c;服务端基于Netty编写。 工…

从C到JAVA之学习JAVA的第一周笔记

文章目录 java语言概述JDK与JRE编写执行过程第一份java代码解读编写编译运行其他 注释三种注释方法 java API文档关键字标识符数据类型基本数据类型自动类型提升规则引用数据类型 string概述String与基本数据类型的变量间的运算 运算符键盘录入运行控制语句数组定义与静态初始化…

【架构-12】JWT和Token

什么是Token? Token的目的是为了减轻服务器的压力&#xff0c;减少频繁的查询数据库&#xff0c;使服务器更加健壮。 Token是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一个令牌&#xff0c;当第一次登录后&#xff0c;服务器生成一个Token便将此Token返回给客…

Smart Link + Monitor Link 实现二层链路故障判断与主备自动切换

一、适用场景&#xff1a; 1、企业中有二层需要提高可靠性业务的主备链路&#xff1b;具备快速收敛性能&#xff0c;收敛速度可达到亚秒级&#xff0c;实现高效可靠。 2、运行的业务对可靠性有要求&#xff0c;对应的网络拓扑不适宜修改为三层链路&#xff0c;只能在原二层链路…

Dockerfile与docker-compose容器编排(Docker系列第3章,共3章)

温馨提示 不同的组件需要不同的docker配置&#xff08;例如容器卷&#xff0c;端口&#xff0c;环境变量等&#xff09;&#xff0c;使用你懂得工具看hub.docker.com官方手册。不要死记硬背&#xff0c;因为这种东西不是天天要写&#xff0c;过段时间就忘了&#xff0c;很容易…

lua 光速入门

文章目录 安装注释字符串变量逻辑运算条件判断循环函数Table (表)常用全局函数模块化 首先明确 lua 和 js Python一样是动态解释性语言&#xff0c;需要解释器执行。并且不同于 Python 的强类型与 js 的弱类型&#xff0c;它有点居中&#xff0c;倾向于强类型。 安装 下载解释…

uniapp封装websocket以及心跳检测、重连

websocket 封装 在所需文件夹下建立websocketUtils.js文件&#xff0c;封装代码如下&#xff1a; class websocketUtils {constructor(openId, time) {this.url wss://**** //ws地址 拼接一下 此处用的是openIdthis.data nullthis.isOpenSocket false //避免重复连接this.…

搭建电商网站跨境电商独立站|网上商城接口/电商数据接口详情

电商运营中&#xff0c;数据分析这项工作越来越重要&#xff0c;许多品牌方也越来越热衷去做电商数据分析。不过&#xff0c;全面的数据该如何获取呢&#xff0c;此时&#xff0c;电商数据接口的重要性便凸显出来了。 监控范围广&#xff1a; 可监控的范围包含京东、天猫、淘…