【java 8】强大的 Stream API
📋 个人简介
- 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
- 📝 个人主页:馆主阿牛🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:java 小白到高手的蜕变🍁
- 💬格言:要成为光,因为有怕黑的人!🔥

目录
- 📋 个人简介
- 前言
- Stream API 说明
- 为什么要使用Stream API
- 什么是 Stream
- Stream 的操作三个步骤
- 创建 Stream 的四种方式(Stream的实例化)
- Stream 的中间操作
- 筛选与切片
- 映射
- 排序
- Stream 的终止操作
- 匹配与查找
- 归约
- 收集
- 结语
前言
java 8中有两个最为重要的改变,第一个就是前面总结的Lambda表达式,另为一个则是Stream API。
这节我将总结一下!
Stream API 说明
- Stream API ( java.util.stream )把真正的函数式编程风格引入到 Java 中。这
是目前为止对 Java 类库最好的补充,因为 Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。 - Stream 是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之, Stream API 提供了一种高效且易于使用的处理数据的方式。
为什么要使用Stream API
- 实际开发中,项目中多数数据源都来自于 Mysql , Oracle 等。但现在数
据源可以更多了,有 MongDB , Redis 等,而这些 NoSQL 的数据就需要 Java 层面去处理。 - Stream 和 Collection 集合的区别: Collection 是一种静态的内存数据
结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU ,通过 CPU 实现计算。
什么是 Stream
Stream 到底是什么呢?
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据, Stream 讲的是计算!”
注意:
① Stream 自己不会存储元素。
② Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream .
③ Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
Stream 的操作三个步骤
1、创建 Stream
一个数据源(如:集合、数组),获取一个流
2、中间操作
一个中间操作链,对数据源的数据进行处理
3、终止操作(终端操作)
一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用

创建 Stream 的四种方式(Stream的实例化)
public class Demo {public static void main(String[] args) {// 创建Stream的方式一:通过集合// default Stream<E> stream():返回一个顺序流List list = new ArrayList();Stream stream1 = list.stream();// default Stream<E> paralleStream():返回一个并行流Stream stream2 = list.parallelStream();// 创建Stream的方式二:通过数组int[] arr = new int[]{1,2,3};// 调用Arrays类的static<T> Stream<T> stream(T[] array):返回一个流IntStream stream = Arrays.stream(arr);// 创建Stream的方式三:通过Stream的of()Stream<Integer> integerStream = Stream.of(1, 2, 3, 4);// 创建Stream的方式四:创建无限流// 迭代// public static<T> Stream<T> iterate(final T seed,final UnaryOperator<T> f)// 例:遍历前10个偶数Consumer<Integer> println = System.out::println;Stream.iterate(0, t -> t+2).limit(10).forEach(println);// 生成// public static<T> Stream<T> generate(Supplier<T> s)Stream.generate(Math::random).limit(10).forEach(System.out::println);}
}
Stream 的中间操作
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为"惰性求值"
筛选与切片

// Stream 的中间操作// 筛选与切片List<String> list = Arrays.asList("阿牛", "小牛", "大牛", "小红");Stream<String> stream = list.stream();// filter(Predicate p) -- 接收Lambda,从流中排出某些信息stream.filter(str -> str.contains("牛")).forEach(System.out::println); //forEach终止操作,传入一个函数式接口中的消费者

List<String> list = Arrays.asList("阿牛", "小牛", "大牛", "小红");Stream<String> stream1 = list.stream();// limit(n) -- 截断流,使其元素不超过给定数量stream1.limit(2).forEach(System.out::println);System.out.println("----------");Stream<String> stream2 = list.stream();// skip(n) -- 跳过元素,返回一个人扔掉前n个元素的流,若流中元素不足n个,则返回一个空流stream2.skip(3).forEach(System.out::println);System.out.println("----------");List<String> list1 = Arrays.asList("阿牛", "小牛", "大牛", "小红","阿牛"); // 添加一个重复元素Stream<String> stream3 = list.stream();// distinct() -- 筛选,通过流所生成元素的hashcode()和equals()去除重复元素stream3.distinct().forEach(System.out::println);

映射

// 映射
// map(Function f) -- 接受一个函数作为参数,这个函数应用到每个元素上,将元素映射为一个新的元素
List<String> list = Arrays.asList("a", "b", "c", "d");
list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);// flatMap(Function f) -- 接受一个函数作为参数,将流中的每个值都映射为另一个流,然后把所有的流连在一起
// 这个我不举例子了,主要可以处理结集合的嵌套,两层嵌套直接用flatMap就不用写两层forEach了

排序

// 排序
// sorted() --自然排序
List<Integer> list= Arrays.asList(12, 14, 3, 6, 10);
list.stream().sorted().forEach(System.out::println);
System.out.println("--------");
// sorted(Comparator com) --定制排序
list.stream().sorted((s1,s2) -> -Integer.compare(s1,s2)).forEach(System.out::println);

Stream 的终止操作
匹配与查找


这里不再写案例!
归约

// 归约
// reduce(T identity,BinaryOperator) - 可以将流中的元素反复结合起来,得到一个值,返回T
// T identity是初始值,BinaryOperator是函数式接口,接受T类型的两个值,返回T类型。
// 例:求1-10的和
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Integer sum = list.stream().reduce(0, Integer::sum);
System.out.println(sum); //55// reduce(BinaryOperator) - 可以将流中的元素反复结合起来,得到一个值,返回optional<T>
收集


// 收集// collect(Collector c)// 例:过滤列表中大于5的元素,结果返回一个ListList<Integer> list = Arrays.asList(1, 2, 5, 6, 8, 7);List<Integer> list1 = list.stream().filter(integer -> integer > 5).collect(Collectors.toList());System.out.println(list1);

结语
还是比较抽象的,你们可以下去多了解了解!
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门
相关文章:
【java 8】强大的 Stream API
📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言Ὅ…...
自动驾驶仿真:ECU TEST自动化测试常用API调用
文章目录一、 API调用运行环境二、ET API帮助文档三、如何导入ET API四、 ET常用接口1、 创建用于添加测试步骤的Package2、 在Package的TestStep中添加precondition块3、 在Package的TestStep中添加Block块4、在Package的TestStep中添加PostconditionBlock块5、 在Package的Te…...
notepad++中使用正则表达式
目录 notepad中使用正则表达式 notepad中正则表达式的语法notepad中常用的正则表达式类notepad中查找窗口的关于正则表达式的参数说明notepad正则表达式不能选择匹配内容notepad正则表达式使用举例 正则表达式提取分隔符前的内容正则表达式替换一个分隔符为换行符删除多余的空…...
什么蓝牙耳机打游戏好?打游戏好用的无线蓝牙耳机
午休或是周末约上好友玩两局游戏,是忙里偷闲的快乐时刻,对于普通游戏玩家,其实耳机够用就行,下面就分享几款打游戏好用的蓝牙耳机。 一、南卡小音舱蓝牙耳机 蓝牙版本:5.3 推荐系数:五颗星 南卡小音舱li…...
基于appium的app自动化测试框架
App自动化测试主要难点在于环境的搭建,appium完全是基于selenium进行的扩展,所以app测试框架也是基于web测试框架开发的 一、设备连接 (即构建基础的测试环境,保证可以驱动设备进行操作) 0.准备测试环境 1࿰…...
【拿好了!Linux 运维必备的 13 款实用工具!】
本文介绍几款 Linux 运维比较实用的工具,希望对 Linux 运维人员有所帮助。 查看进程占用带宽情况 – Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载: http://sourceforge.net/projects/nethogs/files/ne…...
软考中级--嵌入式系统设计师考试培训教程开始了
1.考试时间: 1.1 上半年5月下旬考试 1.2 下半年11月上旬考试 2.考试内容 2.1 系统基础 满分75分 时间150分钟 2.2 系统设计 满分75分 时间150分钟 3.计划安排 3.1 熟悉考试大纲 3.2 按考纲学习相关内容 整理设计知识 快速学习形成知识印象 3.3 复习整理的知识 …...
JDBC学习(复习)-面试总结详细
JDBC详细介绍一、JDBC详细介绍二、jdbc面试总结2.1 JDBC操作数据库的步骤 ?2.2 JDBC中的Statement 和PreparedStatement,CallableStatement的区别?2.3 JDBC中大数据量的分页解决方法?2.4 说说数据库连接池工作原理和实现方案?2.4…...
前端:你不知道的async await
1.先抛出一个场景:你是否在日常开发中经常使用类似代码?async function getXXList () {const result await this.getArrListApi({page:1,id:2})this.arr result.data.listconsole.log(结果是…, this.arr)……………………其他逻辑代码 }1.1 问题那你是…...
c#前端实现对pcl点云颜色根据强度特征动态变化突出指定对象
前言 本文主要介绍如何使用c# winform对点云颜色根据点云强度信息对显示的点云颜色进行动态调整。 目的是根据强度信息采用不同的颜色特征突出不同的物体。 一、点云强度是什么? 点云强度又可以叫做反射率, 通常常见的点云格式包括:以pcl为…...
如何制定达人营销策略
如今,达人营销不再是一个新兴趋势,而是公司整个数字营销战略的一部分。虽然十年前,达人还不存在,但随着公司对数字化营销依赖度地提升,各个领域的大V群体逐渐壮大,越来越多的公司已经采用了达人营销策略。如…...
100种思维模型之三层解释思维模型-020
很多人认为,世界首富巴菲特的日子很轻松,因为他想要什么就可以买什么。 所以,人人都学巴菲特,但很多人不知道学习他什么…… 润米咨询董事长刘润老师在2020年干了这样一件事情:向100个不认识的人学习。如,向…...
RK系列(RK3568) i2s 音频输入 麦克风驱动
平台:Android12SOC:RK3568外围芯片:XS9922i2s简介:从上图看I2s主要的线有:SDO SCLK LRCK MCLK I2S协议只定义三根信号线:串行时钟信号SCLK(BCLK)、数据信号SD和左右声道选择信号WS。(1ÿ…...
Python|Pymol的安装
Pymol的使用其实可以分为两种,一种是GUI图形操作界面,直接可以去Pymol官网上下,另一种则是使用API的方式直接调用,适合写脚本批量处理一些东西。建议画图,看结构直接用GUI,但是计算RMSD啥的,用…...
Mysql中关于查询日志的配置详解
查询日志 MySQL中的查询日志保存在文本文件中,能够记录MySQL中的所有数据操作。 开启查询日志 MySQL默认情况下没有开启查询日志,如果需要开启查询日志,则需要在 my.cnf 文件或者 my.ini 文件的 [mysqld] 选项下进行配置。例如,…...
外包整整干了一年,废了。。。
先说一下自己的个人情况,大专生,18年通过校招进入湖南某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了…...
内网渗透(五十六)之域控安全和跨域攻击-非约束委派攻击
系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…...
初阶C语言——指针【详解】
文章目录1.指针是什么2.指针和指针类型2.1 指针的解引用2.2 指针 -整数3.野指针3.1 野指针成因3.2 如何规避野指针4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算5. 指针和数组6. 二级指针7. 指针数组1.指针是什么 指针理解的2个要点: 指针是内存中一个最…...
MySQL tinyint(1) 、int(32) 与 varchar(255) 长度含义不同
MySQL tinyint(1) 、int(32) 与 varchar(255) 长度含义不同 发现 tinyint(1),int(32) 和 varchar(255) 这里面的数字的含义是不同的。 先说数字类型 tinyint 和 int 等 他们能存储的字节大小是与类型绑定的,即定义了 tinyint 或者 int 就确定了能存储…...
搜索旋转排序数组、路径总和 II、拆分数字
文章目录搜索旋转排序数组(数组、二分查找)路径总和 II(树、深度优先搜索)拆分数字(算法)搜索旋转排序数组(数组、二分查找) 整数数组 nums 按升序排列,数组中的值 互不…...
STM32实战:sprintf格式化字符串在嵌入式LCD显示中的高效应用
1. sprintf函数在STM32开发中的基础应用 第一次在STM32上使用sprintf函数时,我被它的强大功能惊艳到了。这个看似简单的函数,却能帮我们把各种数据类型转换成整齐的字符串,这在嵌入式开发中简直是神器。记得当时我在调试一个温湿度传感器项目…...
菊水PBZ40电源协议详解:从‘*IDN?’到波形设置,一份给硬件测试新人的避坑指南
菊水PBZ40电源协议实战手册:从基础指令到复杂波形配置的工程指南 第一次接触菊水PBZ40可编程电源时,面对满屏的协议指令和参数配置,不少硬件测试工程师都会感到无从下手。这台看似简单的设备,实际上隐藏着许多需要特别注意的细节…...
Windows环境下ODBC连接MySQL保姆级教程(含性能优化配置)
Windows环境下ODBC连接MySQL全流程实战指南 1. 环境准备与驱动安装 在Windows平台使用ODBC连接MySQL数据库,首先需要确保开发环境配置正确。与JDBC不同,ODBC作为跨语言的数据库连接标准,其驱动安装过程需要特别注意版本兼容性问题。以下是环境…...
IntelliJ IDEA中SVN与Git版本管理的高效配置指南
1. 为什么需要版本管理工具? 如果你曾经因为误删代码而熬夜重写,或者因为团队协作时文件覆盖而崩溃,那你一定需要版本管理工具。想象一下,代码就像写作文时的草稿纸——每次修改都保留历史版本,随时可以回退到上周二下…...
G-Helper终极指南:如何用轻量工具延长华硕笔记本电池寿命50%
G-Helper终极指南:如何用轻量工具延长华硕笔记本电池寿命50% 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Str…...
快速原型设计:使用快马平台ai一键生成c语言银行系统项目骨架
今天想和大家分享一个快速验证技术方案的小技巧——用InsCode(快马)平台的AI生成功能快速搭建C语言项目原型。最近在准备一个银行系统的课程设计时,发现这个方式特别适合用来做前期技术验证。 为什么需要快速原型 刚开始做课程设计时,最头疼的就是花大量…...
LFM2.5-1.2B-Thinking多场景落地:Ollama支持下的技术博客写作、论文摘要生成案例
LFM2.5-1.2B-Thinking多场景落地:Ollama支持下的技术博客写作、论文摘要生成案例 你是不是也遇到过这样的烦恼:想写一篇技术博客,对着空白的文档发呆半天,不知道从何下笔;或者面对一篇几十页的学术论文,需…...
华为五级流程体系(L1-L5) 、流程框架、实施方法与最佳实践108页PPT
一、华为流程体系 业务流程持续变革促进华为业务的高速发展,持续管理变革,降低运作成本、提升运作效率,实现对客户端到端优质交付.把过去,好的方法固话下来。推广出去,提高效率和质量降低业务风险;提供多条路径和方法,…...
5分钟掌握PESQ:Python语音质量评估终极指南
5分钟掌握PESQ:Python语音质量评估终极指南 【免费下载链接】PESQ PESQ (Perceptual Evaluation of Speech Quality) Wrapper for Python Users (narrow band and wide band) 项目地址: https://gitcode.com/gh_mirrors/pe/PESQ 想要客观评估语音处理算法效果…...
3个AI编程助手功能让JetBrains开发者效率提升80%
3个AI编程助手功能让JetBrains开发者效率提升80% 【免费下载链接】continue ⏩ Source-controlled AI checks, enforceable in CI. Powered by the open-source Continue CLI 项目地址: https://gitcode.com/GitHub_Trending/co/continue Continue作为一款开源的AI编程助…...
