Java_26_Stream流
Stream
什么是Stream流?
在Java 8中,得益于Lambda所带来的函数式编程,
引入了一个全新的Stream流概念 ,用于解决已有集合/数组类库有的弊端。Stream流能解决什么问题?
可以解决已有集合类库或者数组API的弊端。
Stream认为集合和数组操作的API很不好用,所以采用了Stream流简化集合和数组的操作!!小结:
Stream流是用来简化集合类库或者数组API的弊端。
Stream流其实就一根传送带,元素在上面可以被Stream流操作。
需求:从集合中筛选出所有姓张的人出来。然后再找出姓名长度是3的人。
传统写法
public class StreamDemo01 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");//1.找姓张的人List<String> Z_list = new ArrayList<>();for (String s : list) {if(s.startsWith("张")){Z_list.add(s);}}System.out.println(Z_list);//2.姓名长度为3List<String> Z_Long_list = new ArrayList<>();for (String s : Z_list) {if(s.length() == 3) Z_Long_list.add(s);}System.out.println(Z_Long_list);}
}
Stream流写法
public class StreamDemo01 {public static void main(String[] args) {//需求:从集合中筛选出所有姓张的人出来。然后再找出姓名长度是3的人。List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);}
}
如上见得:stream基于函数式编程,更加简单!
他的限制流filter可以链式编程,最后遍历!
Stream流的获取
Stream流式思想的核心:
先得到集合或者数组的Stream流(就是一根传送带)然后就用这个Stream流操作集合或者数组的元素。然后用Stream流简化替代集合操作的API.集合获取流的API:
(1) default Stream stream();小结:
集合获取Stream流用: stream();
数组:Arrays.stream(数组) / Stream.of(数组);
public class StreamDemo01 {public static void main(String[] args) {/** --------------------Collection集合获取流------------------------------- */// Collection集合如何获取Stream流。Collection<String> c = new ArrayList<>();Stream<String> ss = c.stream();/** --------------------Map集合获取流------------------------------- */Map<String, Integer> map = new HashMap<>();// 先获取键的Stream流。Stream<String> keyss = map.keySet().stream();// 在获取值的Stream流Stream<Integer> valuess = map.values().stream();// 获取键值对的Stream流(key=value: Map.Entry<String,Integer>)Stream<Map.Entry<String,Integer>> keyAndValues = map.entrySet().stream();/** ---------------------数组获取流------------------------------ */// 数组也有Stream流。String[] arrs = new String[]{"Java", "JavaEE" ,"Spring Boot"};Stream<String> arrsSS1 = Arrays.stream(arrs);Stream<String> arrsSS2 = Stream.of(arrs);}
}
Stream的常用API
forEach : 逐一处理(遍历)
count:统计个数
– long count();
filter : 过滤元素
– Stream filter(Predicate<? super T> predicate)
limit : 取前几个元素
skip : 跳过前几个
map : 加工方法
concat : 合并流。
public class StreamDemo03 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.add("张三丰");//遍历foreachlist.stream().filter(s -> s.length() == 3).filter(s -> s.startsWith("张")).forEach(System.out::println);//统计个数countlong count = list.stream().filter(s -> s.length() == 3).filter(s -> s.startsWith("张")).count();System.out.println(count);//取前几个list.stream().filter(s -> s.length() == 3).limit(2).forEach(System.out::println);//跳过前几个list.stream().filter(s -> s.length() == 3).skip(2).forEach(System.out::println);//map方法(映射):加工方法 将原元素加工后放上去/*将所有名称都加上小小的……*/list.stream().map(s -> "小小的" + s).forEach(System.out::println);/*将名称都加工成学生对象*///list.stream().map(s -> new Student(s)).forEach(System.out::println);list.stream().map(Student::new).forEach(System.out::println);//构造器引用/*** concat合并流*///数组流Stream<Integer> s1 = Stream.of(10,20,30,40);//集合流Stream<String> s2 = list.stream();//合并流 类型不同可用Object接 只能两两合并!!!!Stream<Object> allStream = Stream.concat(s1,s2);allStream.forEach(System.out::println);}
}
综合案例
public class StreamDemo04 {public static void main(String[] args) {List<String> one = new ArrayList<>();one.add("迪丽热巴");one.add("宋远桥");one.add("苏星河");one.add("老子");one.add("庄子");one.add("孙子");one.add("洪七公");List<String> two = new ArrayList<>();two.add("古力娜扎");two.add("张无忌");two.add("张三丰");two.add("赵丽颖");two.add("张二狗");two.add("张天爱");two.add("张三");/*** 1. 第一个队伍只要名字为3个字的成员姓名;* 2. 第一个队伍筛选之后只要前3个人;*/Stream<String> oneStream = one.stream().filter(s -> s.length() == 3).limit(3);/*** 3. 第二个队伍只要姓张的成员姓名;* 4. 第二个队伍筛选之后不要前2个人;* 5. 将两个队伍合并为一个队伍;*/Stream<String> twoStream = two.stream().filter(s -> s.startsWith("张")).skip(2);Stream<String> allStream = Stream.concat(oneStream,twoStream);/*** 6. 根据姓名创建`Student`对象; (加工)* 7. 打印整个队伍的Student对象信息。*/allStream.map(Student::new).forEach(System.out::println);}
}
Stream终结与非终结方法
终结方法:一旦Stream调用了终结方法,流的操作就全部终结了,不能继续使用,
只能创建新的Stream操作。
终结方法: foreach , count。非终结方法:每次调用完成以后返回一个新的流对象,
可以继续使用,支持链式编程!
public class StreamDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.add("张三丰");// foreach终结方法list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);long count = list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).count();System.out.println(count);}
}
收集Stream流
引入:
- Stream的作用是:把集合转换成一根传送带,借用Stream流的强大功能进行的操作。但是实际开发中数据最终的形式还是应该是集合,最终Stream流操作完毕以后还是要转换成集合。这就是收集Stream流。
收集Stream流的含义:就是把Stream流的数据转回到集合中去。
Stream流:手段。
集合:才是目的。小结:
收集Stream流的含义:就是把Stream流的数据转回到集合中去。熟练函数式编程,如Lambda表达式简化函数式接口的匿名内部类形式,以及四种方法引用简化Lambda表达式,以及流式编程思想如Stream简化集合或者数组的操作。
public class StreamDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.add("张三丰");Stream<String> zhangLists = list.stream().filter(s -> s.startsWith("张"));// 把stream流转换成Set集合。Set<String> sets = zhangLists.collect(Collectors.toSet());System.out.println(sets);// 把stream流转换成List集合。Stream<String> zhangLists1 = list.stream().filter(s -> s.startsWith("张"));List<String> lists= zhangLists1.collect(Collectors.toList());System.out.println(lists);// 把stream流转换成数组。Stream<String> zhangLists2 = list.stream().filter(s -> s.startsWith("张"));Object[] arrs = zhangLists2.toArray();// 可以借用构造器引用申明转换成的数组类型!!!String[] arrs1 = zhangLists2.toArray(String[]::new);}
}
相关文章:
Java_26_Stream流
Stream 什么是Stream流? 在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念 ,用于解决已有集合/数组类库有的弊端。 Stream流能解决什么问题? 可以解决已有集合类库或者数组API的弊端。 Stream认为集合…...
周四见 | 物流人的一周资讯
京东支付年活跃用户数超1.9亿 7月27日消息,京东科技发布2022年环境、社会及公司治理报告。报告显示,在推动社会公平方面,2022年京东科技帮助超207万家中小微企业实现数智化转型,为42万中小微企业提供贷款,节省融资成本…...
uniapp 即时通讯开发流程详解
今天我将为您详细介绍UniApp开发中的即时通讯流程。本文将向您展示如何在UniApp中实现即时通讯功能,为您的应用程序增添交互性和实时性。 1. 准备工作 在开始开发之前,确保您已完成以下准备工作: 确保您已经安装好UniApp开发环境ÿ…...
【Terraform学习】Terraform-docker部署快速入门(快速入门)
Terraform-docker部署快速入门 实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中,单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分,为角色选择可信实体类型: AWS 服务 使用案例:EC2 单击下一步 添加权限&#x…...
C# 全局响应Ctrl+Alt+鼠标右键
一、简述 某些应用,我们希望全局自定义热键。按键少了会和别的应用程序冲突,按键多了可定用户操作不变。因此我计划左手用CtrlAlt,右手用鼠标右键呼出我自定义的菜单。 我使用键盘和鼠标事件进行简单测试(Ctrl鼠标右键ÿ…...
【Leetcode】54.螺旋矩阵
一、题目 1、题目描述 给你一个 m m m 行 n n n 列的矩阵 matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例1: 输入:matrix =...
怎样计算一个算法的复杂度?
分析一个算法主要看这个算法的执行需要多少机器资源。在各种机器资源中,时间和空间是两个最主要的方面。因此,在进行算法分析时,人们最关心的就是运行算法所要花费的时间和算法中使用的各种数据所占用的空间资源。算法所花费的时间通常称为时…...
【问题记录】Ubuntu 22.04 环境下,打开 VS Code 老是访问密钥环该怎么解决?
目录 环境 问题情况 解决方法 环境 VMware Workstation 16 Pro (版本:16.1.2 build-17966106)ubuntu-22.04.2-desktop-amd64 问题情况 在Ubuntu下,每次运行 VS Code时,老是提示要输入密钥密码来解锁保存在密钥环&am…...
format格式化输出语法详解
hello,这里是Token_w的文章,主要讲解python的基础学习,希望对大家有所帮助 整理不易,感觉还不错的可以点赞收藏评论支持,感谢! 使用 % 操作符对各种类型的数据进行格式化输出,这是早期 Python提…...
RocketMQ教程-(5)-功能特性-事务消息
事务消息为 Apache RocketMQ 中的高级特性消息,本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。 事务消息为 Apache RocketMQ 中的高级特性消息,本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。…...
HANA学习笔记
1、安装 准备安装介质,我这儿用的是HANA2.00.059.00,注意会用到三个lib包和saptune,提前准备好。 执行./hdblcm开启数据库安装,过程中会涉及到需要用户设置一些参数,按照自己需求设置即可。 安装完成会生成一个安装日…...
VMware虚拟机无法上网的解决办法
(1)1、在虚拟机右下角的网络适配器上面观察该图标是否是有绿色的灯在闪烁,如果网络适配器是灰色的证明虚拟机的网络没有打开,而是被禁用了,在适配器上点击鼠标右键,打开【设置】,在【已连接】、…...
PLC-Recorder的高速采集有多快?0.5ms算快吗?看控制器能力了!
大家知道,PLC-Recorder有一个高速采集的功能,基于TCP连接或UDP报文,速度取决于发送端的能力。对于西门子PLC,能做到1-2ms的采集速度,但是,我在前面的文章里提到了0.5ms的高速采集,哪个控制器能这…...
KMP算法总结
KMP算法总结 BF算法引导BF算法步骤(图片演示)代码演示 KMP算法推next数组代码演示 BF算法引导 BF算法是一个暴力的字符串匹配算法,时间复杂度是o(m*n) 假设主串和子串分别为 我们想要找到子串在主串的位置 BF算法核…...
消息中间件ActiveMQ介绍
一、消息中间件的介绍 介绍 消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成。 特点(作用) 应用解耦 异步通信 流量削峰 (海量)日志处理 消息通讯 …... 应用场景 根据消息队列的特点&a…...
【100天精通python】Day9:数据结构_字典、集合
目录 目录 1 字典 1.1 字典的基本操作示例 1.2 字典推导式 2 集合 2.1 集合的常用操作示例 3 列表、元组、字典、集合的区别 1 字典 在Python中,字典(Dictionary)是一种无序的数据结构,用于存储键值对的集合。每个…...
上海VR全景展示,快速了解VR全景拍摄
导语: 随着科技的不断进步,虚拟现实技术的应用日益广泛。在这其中,VR全景图片作为一种数字化助力的全景拍摄方式,正逐渐成为人们关注的焦点。通过数字化技术,VR全景图片能够以360度全方位的视角呈现真实的场景&#x…...
VScode远程不用再输入密码操作
安装插件remote development 1.先检查自己电脑上有没有生成一对公钥和私钥。(一般会在这个目录) 如果没有的话就自己生成一下。 打开命令行输入以下命令 ssh-keygen -t rsa2.在虚拟机中先看一下有没有公钥和私钥。如果没有的话就自己生成一下。 打开…...
MyBatis基本用法-@TableId
TableId 注解是 MyBatis Plus 框架中用于标识实体类中的主键字段的注解,它有一些可选的配置项。下面是详细说明: 首先,需要在项目中添加 MyBatis Plus 的依赖。可以在项目的 pom.xml 文件中添加以下代码: <dependency><…...
React AntDesign写一个导出数据的提示语 上面有跳转的路径,或者点击知道了,关闭该弹层
效果如下: 代码如下: ForwardDataCenterModal(_blank);export const ForwardDataCenterModal (target?: string) > {let contentBefore React.createElement(span, null, 数据正在处理中,请稍后前往);let contentAfter React.creat…...
Phi-4-mini-reasoning实操手册:从模型加载到端口访问完整流程
Phi-4-mini-reasoning实操手册:从模型加载到端口访问完整流程 1. 模型概述 Phi-4-mini-reasoning是一款3.8B参数的轻量级开源模型,专为数学推理、逻辑推导和多步解题等强逻辑任务设计。该模型由Azure AI Foundry开发,主打"小参数、强推…...
如何快速解决Places.js地址自动补全的5个常见错误:终极处理技巧指南
如何快速解决Places.js地址自动补全的5个常见错误:终极处理技巧指南 【免费下载链接】places :globe_with_meridians: Turn any into an address autocomplete 项目地址: https://gitcode.com/gh_mirrors/pl/places Places.js是一个强大的地址自动补全JavaS…...
3步轻松搞定大麦网抢票:告别手动刷票的Python自动化脚本
3步轻松搞定大麦网抢票:告别手动刷票的Python自动化脚本 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为抢不到演唱会门票而烦恼吗?🤔 热门演出门票秒光…...
Freqtrade实盘避坑手册:我用这个开源框架3个月跑通加密货币策略
Freqtrade实盘避坑手册:3个月实战打磨的加密货币策略进阶指南 当第一次在Binance交易所看到自己开发的量化策略自动执行交易时,那种程序化交易带来的震撼感至今难忘。Freqtrade作为开源框架中的佼佼者,确实为个人开发者提供了从回测到实盘的完…...
PowerPaint-V1 Gradio场景应用:从家庭照片修复到工作素材处理
PowerPaint-V1 Gradio场景应用:从家庭照片修复到工作素材处理 1. 引言:图像修复的日常革命 周末整理老照片时,发现珍贵的全家福上有几处划痕;准备工作报告时,急需一张专业配图却找不到合适素材;电商运营需…...
MySQL 故障排查与生产环境优化笔记
一、基础信息1. 实验环境数据库版本:MySQL 8.0架构:1 台单实例 2 台主从复制环境用途:模拟生产故障、验证优化方案2. MySQL 逻辑架构(四层)连接层处理客户端连接、授权认证、权限校验提供线程池、SSL 安全连接服务层S…...
OpenClaw社区贡献指南:为Qwen3-14b_int4_awq开发并分享自定义技能
OpenClaw社区贡献指南:为Qwen3-14b_int4_awq开发并分享自定义技能 1. 为什么我们需要更多社区技能 上周我尝试用OpenClaw自动整理电脑里堆积如山的PDF论文时,发现现有的文件处理技能无法识别某些特殊格式的学术文献。这个痛点让我意识到:Op…...
HP 现在可以零成本构建原生 iOS 和 Android 应用 NativePHP for Mobile v3 发布
插件化架构 v3 版本最大的变化是引入了模块化插件系统。此前版本中集成在核心包里的原生功能,现在被拆分成独立的插件。 每个插件都是一个独立的 Composer 包,包含 Swift 和 Kotlin 代码、权限清单以及原生依赖。开发者只需安装实际用到的插件…...
有了这个Python备忘录,代码拿来即用
这段时间代码写的少了,周末用python写一个小爬虫,却发现连线程的一些方法都不记得了,还得百度查教程。工作越忙,记性越差,发现我疏远了代码,代码也疏远了我。 PS:对于小白来说自学也不是件容易…...
SEO_10个提升网站排名的SEO技巧与实战方法
SEO:10个提升网站排名的SEO技巧与实战方法 在当今数字化时代,网站排名不仅关乎网站的曝光率,更影响到业务的发展。因此,提升网站排名(SEO)成为了每一个网站主的首要任务。有哪些SEO技巧能够帮助提升网站的排名呢&…...
