JAVA基础---Stream流

Stream流出现背景

背景

在Java8之前,通常用 fori、for each 或者 Iterator 迭代来重排序合并数据,或者通过重新定义 Collections.sorts的 Comparator 方法来实现,这两种方式对 大数量系统来说,效率不理想。

Java8 中添加了一个新的接口类 Stream,相当于高级版的 Iterator,通过Lambda 表达式对集合进行各种非常便利、高效的聚合操作(Aggregate Operation),或者大批量数据操作 (Bulk Data Operation)。Stream不仅可以通过串行的方式实现数据操作,还可以通过并行的方式处理大批量数据,提高数据的处理效率。

解释

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

  1. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

    select * from user where age >30

    流水线:

    空瓶子--》灌水---》盖盖子--》贴标签 --->一瓶农夫三拳

  2. Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

  3. 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

  4. 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

什么是Stream流

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  1. <strong元素队列< strong="">元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。</strong元素队列<>

  2. 数据源 流的来源。 可以是集合,数组,I/O channel(nio new IO非阻塞式IO), 产生器generator 等。

  3. 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

    和以前的Collection操作不同, Stream操作还有两个基础的特征:

  4. Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。

  5. 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

如何生成流

在 Java 8 中, 集合接口有两个方法来生成流:

stream() − 为集合创建串行流。

parallelStream() − 为集合创建并行流。

常用方法

for each(循环遍历)

public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for eachlist.stream().forEach(System.out::println);}
}

运行结果

map

public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for eachlist.stream().forEach(System.out::println);//list中的每个元素都乘以3然后再打印list.stream().map(integer -> integer*3)//map表示对什么进行操作,箭头前面为数据,箭头后面为对数据进行的操作.forEach(System.out::println);}
}

运行结果

fliter

public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for eachlist.stream().forEach(System.out::println);//list中的每个元素都乘以3然后再打印list.stream().map(integer -> integer*3)//map表示对什么进行操作,箭头前面为数据,箭头后面为对数据进行的操作.forEach(System.out::println);System.out.println("======================使用过滤器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).forEach(System.out::println);}
}

运行结果

limit

public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for eachlist.stream().forEach(System.out::println);//list中的每个元素都乘以3然后再打印list.stream().map(integer -> integer*3)//map表示对什么进行操作,箭头前面为数据,箭头后面为对数据进行的操作.forEach(System.out::println);System.out.println("======================使用过滤器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).forEach(System.out::println);System.out.println("======================使用限制器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).limit(3)//限制只输出3个元素(前三个).forEach(System.out::println);}
}

运行结果

sorted

public class StreamTest {public static void main(String[] args) {List<Integer> list= Arrays.asList(1,2,-2,3,4,5,6,7,8);//for each        list.stream().forEach(System.out::println);//list中的每个元素都乘以3然后再打印list.stream().map(integer -> integer*3)//map表示对什么进行操作,箭头前面为数据,箭头后面为对数据进行的操作.forEach(System.out::println);System.out.println("======================使用过滤器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).forEach(System.out::println);System.out.println("======================使用限制器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>7).limit(3)//限制只输出3个元素(前三个).forEach(System.out::println);System.out.println("======================使用排序器=============================");list.stream().map(integer -> integer*2).filter(integer -> integer>-100).sorted()//默认从小到大排序.limit(6)//限制只输出3个元素(前三个).forEach(System.out::println);}
}

运行结果

并行流与串行流

parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

写在最后:流式编程是JAVA中一种很重要的编程思想,希望大家能够重视,这对提高代码效率十分有帮助。

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

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

相关文章

张大哥笔记:服务器有挖矿木马程序,该如何处理?

这篇文章发表于2021年&#xff0c;今天借这个平台再发布一下&#xff0c;希望对大家有所帮助&#xff01; 今天收到一个粉丝求助&#xff0c;说收到了阿里云官方短信通知提示有挖矿程序&#xff0c;要求立即整改&#xff0c;否则会关停服务器&#xff0c;以下是我和他的对话内…

代码学习录打卡Day13

1 滑动窗口最大值 使用单调队列&#xff0c;需要一个队列&#xff0c;这个队列呢&#xff0c;放进去窗口里的元素&#xff0c;然后随着窗口的移动&#xff0c;队列也一进一出&#xff0c;每次移动之后&#xff0c;队列告诉我们里面的最大值是什么。 class MyQueue { public:vo…

WebSocket 全面解析

&#x1f31f; 引言 WebSocket&#xff0c;一个让实时通信变得轻而易举的神器&#xff0c;它打破了传统HTTP协议的限制&#xff0c;实现了浏览器与服务器间的全双工通信。想象一下&#xff0c;即时消息、在线游戏、实时股票报价…这一切都离不开WebSocket的魔力&#x1f4ab;。…

Python量化炒股的获取数据函数—get_concept()

查询股票所属的概念板块函数get_concept()&#xff0c;利用该函数可以查询一只或多只股票所属的概念板块&#xff0c;其语法格式如下&#xff1a; get_concept(security, dateNone)security&#xff1a;标的代码。类型为字符串&#xff0c;形式如‘000001.XSHE’&#xff0c;或…

宽字符的来历:从ASCII到Unicode,C语言中的宽字符处理

目录 一、ASCII编码&#xff1a;字符世界的开篇 二、Unicode与宽字符的诞生 宽字符类型与宽字符串 三、C语言中的宽字符处理函数 四、宽字符与多字节字符 结语 在计算机科学的发展历程中&#xff0c;字符编码经历了从简单到复杂、从单一语言到全球多语种支持的演变过程。…

【论文阅读】IPT:Pre-TrainedImageProcessingTransformer

Pre-TrainedImageProcessingTransformer 论文地址摘要1. 简介2.相关作品2.1。图像处理2.2。 Transformer 3. 图像处理3.1. IPT 架构3.2 在 ImageNet 上进行预训练 4. 实验4.1. 超分辨率4.2. Denoising 5. 结论与讨论 论文地址 1、论文地址 2、源码 摘要 随着现代硬件的计算能…

2024年第十五届蓝桥杯江苏省赛回顾

呜呜呜~~~ 我在考完了后感觉自己直接炸了&#xff1a;好多学到的算法都没有用上&#xff0c;几乎所有的题目都是暴力的。。。 最后十几分钟对于一道dp算法终于有思路了&#xff0c;但是。。匆匆忙忙之间就是没有调试出来。&#xff08;还是交了一道暴力[旋风狗头]直接哭死~~&…

iOS - 多线程-atomic

文章目录 iOS - 多线程-atomic1. 源码分析1.1 get方法1.2 set方法 2. 一般不使用atomic的原因 iOS - 多线程-atomic atomic用于保证属性setter、getter的原子性操作&#xff0c;相当于在getter和setter内部加了线程同步的锁可以参考源码objc4的objc-accessors.mm它并不能保证使…

Whisper、Voice Engine推出后,训练语音大模型的高质量数据去哪里找?

近期&#xff0c;OpenAI 在语音领域又带给我们惊喜&#xff0c;通过文本输入以及一段 15 秒的音频示例&#xff0c;可以生成既自然又与原声极为接近的语音。值得注意的是&#xff0c;即使是小模型&#xff0c;只需一个 15 秒的样本&#xff0c;也能创造出富有情感且逼真的声音。…

springboot3常用注解使用

组键注册注解 组件注册步骤总结 条件注解 演示示例 属性绑定注解 ConfigurationProperties进行绑定 EnableConfigurationProperties进行绑定 其他常用注解 EnableAutoConfiguration ComponentScan RequestMapping GetMapping PostMapping Autowired Resource Servi…

Objective-C大爆炸:从零到单例模式

oc学习笔记&#xff08;一&#xff09; 文章目录 oc学习笔记&#xff08;一&#xff09;oc与c语言的区别#import的用法foundation框架NSLog函数NSString类型符号的作用oc中的数据类型 类与对象概念&#xff1a; 创建第一个类类的定义类的实现类加载对象的产生和使用 self语法id…

为什么说B端SaaS产品经理需要让研发团队懂业务

先问是不是&#xff0c;再问为什么。这个问题即对也不对。 1.对的地方&#xff1a;研发团队里面的架构师、前后端leader、组长或者骨干如果懂业务的话&#xff0c;就能在做系统业务架构、信息架构和数据架构的时候多一些前瞻性&#xff0c;为后期业务扩展预留一些接口或者能力…

ElasticSearch面试题2

Mapping属性详细介绍/常见的字段数据类型&#xff1a; 映射(mapping)︰mapping是对索引库中文档的约束信息&#xff08;例如字段名、数据类型&#xff09;&#xff0c;类似表的结构约束&#xff1b;每个索引库都应该有自己的映射 数据库一定要先创建表才能去添加数据…

【机器学习】视觉基础模型的三维意识:前沿探索与局限

视觉基础模型的三维意识&#xff1a;前沿探索与局限 一、引言二、视觉基础模型的三维意识三、当前模型的局限性四、实验与结果五、总结与展望 大规模预训练的进展已经产生了具有强大能力的视觉基础模型。最近的模型不仅可以推广到任意图像的训练任务&#xff0c;而且它们的中间…

yo!这里是网络入门初识

目录 前言 基本概念 网络 协议 地址 网络传输流程 OSI七层模型 TCP/IP四层&#xff08;五层&#xff09;模型 流程图 数据封装&&分用 后记 前言 对于上一个专栏——Linux操作系统&#xff0c;我们学习了操作系统的基础知识以及基本的系统编程&#xff0c;其…

Kafka客户端工具:Offset Explorer 使用指南

Kafka作为一个分布式流处理平台&#xff0c;在大数据处理和实时数据流应用中扮演着至关重要的角色。管理Kafka的topics及其offsets对于维护系统稳定性和数据一致性至关重要。Offset Explorer是一个强大的桌面应用程序&#xff0c;它使得管理和监控Kafka集群变得简单直观。本文将…

ffmpeg音视频裁剪

音视频裁剪&#xff0c;通常会依据时间轴为基准&#xff0c;从某个起始点到终止点的音视频截取出来&#xff0c;当然音视频文件中存在多路流&#xff0c;所对每一组流进行裁剪 基础概念&#xff1a; 编码帧的分类&#xff1a; I帧(Intra coded frames): 关键帧&#xff0c;…

xLua热更新解决方案

图中灰色的无法实现热更新&#xff0c;而Lua代码可以打包成AB包&#xff0c;并上传到资源服务器&#xff0c; 当进入游戏检测是否有资源需要更新&#xff0c;需要则会从资源服务器下载。 学习目标 1.导入xLua框架 2.C#调用Lua 3.Lua调用C# 4.xLua热补丁 xLua框架导入和AB…

如何消除浏览器SmartScreen对网站“不安全”提示?

面对互联网时代用户对网站安全性和可信度的严苛要求&#xff0c;网站运营者时常遭遇Microsoft Defender SmartScreen&#xff08;SmartScreen&#xff09;提示网站不安全的困扰。本文将剖析SmartScreen判定网站不安全的原因&#xff0c;并为运营者提供应对策略&#xff0c;以恢…

机器学习:基于Sklearn、XGBoost框架,使用逻辑回归、支持向量机和XGBClassifier来诊断并预测一个人是否患有自闭症

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…