当前位置: 首页 > news >正文

Java_26_Stream流

Stream

  1. 什么是Stream流?
    在Java 8中,得益于Lambda所带来的函数式编程,
    引入了一个全新的Stream流概念 ,用于解决已有集合/数组类库有的弊端。

  2. Stream流能解决什么问题?
    可以解决已有集合类库或者数组API的弊端。
    Stream认为集合和数组操作的API很不好用,所以采用了Stream流简化集合和数组的操作!!

  3. 小结:
    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流的获取

  1. Stream流式思想的核心:
    先得到集合或者数组的Stream流(就是一根传送带)然后就用这个Stream流操作集合或者数组的元素。然后用Stream流简化替代集合操作的API.

  2. 集合获取流的API:
    (1) default Stream stream();

  3. 小结:
    集合获取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终结与非终结方法

  1. 终结方法:一旦Stream调用了终结方法,流的操作就全部终结了,不能继续使用,
    只能创建新的Stream操作。
    终结方法: foreach , count。

  2. 非终结方法:每次调用完成以后返回一个新的流对象,
    可以继续使用,支持链式编程!

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流

  1. 引入:

    1. Stream的作用是:把集合转换成一根传送带,借用Stream流的强大功能进行的操作。但是实际开发中数据最终的形式还是应该是集合,最终Stream流操作完毕以后还是要转换成集合。这就是收集Stream流。
  2. 收集Stream流的含义:就是把Stream流的数据转回到集合中去。

  3. Stream流:手段。
    集合:才是目的。

  4. 小结:
    收集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流&#xff1f; 在Java 8中&#xff0c;得益于Lambda所带来的函数式编程&#xff0c; 引入了一个全新的Stream流概念 &#xff0c;用于解决已有集合/数组类库有的弊端。 Stream流能解决什么问题? 可以解决已有集合类库或者数组API的弊端。 Stream认为集合…...

周四见 | 物流人的一周资讯

京东支付年活跃用户数超1.9亿 7月27日消息&#xff0c;京东科技发布2022年环境、社会及公司治理报告。报告显示&#xff0c;在推动社会公平方面&#xff0c;2022年京东科技帮助超207万家中小微企业实现数智化转型&#xff0c;为42万中小微企业提供贷款&#xff0c;节省融资成本…...

uniapp 即时通讯开发流程详解

今天我将为您详细介绍UniApp开发中的即时通讯流程。本文将向您展示如何在UniApp中实现即时通讯功能&#xff0c;为您的应用程序增添交互性和实时性。 1. 准备工作 在开始开发之前&#xff0c;确保您已完成以下准备工作&#xff1a; 确保您已经安装好UniApp开发环境&#xff…...

【Terraform学习】Terraform-docker部署快速入门(快速入门)

Terraform-docker部署快速入门 实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中&#xff0c;单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分&#xff0c;为角色选择可信实体类型&#xff1a; AWS 服务 使用案例:EC2 单击下一步 添加权限&#x…...

C# 全局响应Ctrl+Alt+鼠标右键

一、简述 某些应用&#xff0c;我们希望全局自定义热键。按键少了会和别的应用程序冲突&#xff0c;按键多了可定用户操作不变。因此我计划左手用CtrlAlt&#xff0c;右手用鼠标右键呼出我自定义的菜单。 我使用键盘和鼠标事件进行简单测试&#xff08;Ctrl鼠标右键&#xff…...

【Leetcode】54.螺旋矩阵

一、题目 1、题目描述 给你一个 m m m 行 n n n 列的矩阵 matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例1: 输入:matrix =...

怎样计算一个算法的复杂度?

分析一个算法主要看这个算法的执行需要多少机器资源。在各种机器资源中&#xff0c;时间和空间是两个最主要的方面。因此&#xff0c;在进行算法分析时&#xff0c;人们最关心的就是运行算法所要花费的时间和算法中使用的各种数据所占用的空间资源。算法所花费的时间通常称为时…...

【问题记录】Ubuntu 22.04 环境下,打开 VS Code 老是访问密钥环该怎么解决?

目录 环境 问题情况 解决方法 环境 VMware Workstation 16 Pro &#xff08;版本&#xff1a;16.1.2 build-17966106&#xff09;ubuntu-22.04.2-desktop-amd64 问题情况 在Ubuntu下&#xff0c;每次运行 VS Code时&#xff0c;老是提示要输入密钥密码来解锁保存在密钥环&am…...

format格式化输出语法详解

hello&#xff0c;这里是Token_w的文章&#xff0c;主要讲解python的基础学习&#xff0c;希望对大家有所帮助 整理不易&#xff0c;感觉还不错的可以点赞收藏评论支持&#xff0c;感谢&#xff01; 使用 % 操作符对各种类型的数据进行格式化输出&#xff0c;这是早期 Python提…...

RocketMQ教程-(5)-功能特性-事务消息

事务消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。 事务消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。…...

HANA学习笔记

1、安装 准备安装介质&#xff0c;我这儿用的是HANA2.00.059.00&#xff0c;注意会用到三个lib包和saptune&#xff0c;提前准备好。 执行./hdblcm开启数据库安装&#xff0c;过程中会涉及到需要用户设置一些参数&#xff0c;按照自己需求设置即可。 安装完成会生成一个安装日…...

VMware虚拟机无法上网的解决办法

&#xff08;1&#xff09;1、在虚拟机右下角的网络适配器上面观察该图标是否是有绿色的灯在闪烁&#xff0c;如果网络适配器是灰色的证明虚拟机的网络没有打开&#xff0c;而是被禁用了&#xff0c;在适配器上点击鼠标右键&#xff0c;打开【设置】&#xff0c;在【已连接】、…...

PLC-Recorder的高速采集有多快?0.5ms算快吗?看控制器能力了!

大家知道&#xff0c;PLC-Recorder有一个高速采集的功能&#xff0c;基于TCP连接或UDP报文&#xff0c;速度取决于发送端的能力。对于西门子PLC&#xff0c;能做到1-2ms的采集速度&#xff0c;但是&#xff0c;我在前面的文章里提到了0.5ms的高速采集&#xff0c;哪个控制器能这…...

KMP算法总结

KMP算法总结 BF算法引导BF算法步骤&#xff08;图片演示&#xff09;代码演示 KMP算法推next数组代码演示 BF算法引导 BF算法是一个暴力的字符串匹配算法&#xff0c;时间复杂度是o&#xff08;m*n&#xff09; 假设主串和子串分别为 我们想要找到子串在主串的位置 BF算法核…...

消息中间件ActiveMQ介绍

一、消息中间件的介绍 介绍 ​ 消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流&#xff0c;并基于 数据通信 来进行分布式系统的集成。 特点(作用) 应用解耦 异步通信 流量削峰 (海量)日志处理 消息通讯 …... 应用场景 根据消息队列的特点&a…...

【100天精通python】Day9:数据结构_字典、集合

目录 目录 1 字典 1.1 字典的基本操作示例 1.2 字典推导式 2 集合 2.1 集合的常用操作示例 3 列表、元组、字典、集合的区别 1 字典 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种无序的数据结构&#xff0c;用于存储键值对的集合。每个…...

上海VR全景展示,快速了解VR全景拍摄

导语&#xff1a; 随着科技的不断进步&#xff0c;虚拟现实技术的应用日益广泛。在这其中&#xff0c;VR全景图片作为一种数字化助力的全景拍摄方式&#xff0c;正逐渐成为人们关注的焦点。通过数字化技术&#xff0c;VR全景图片能够以360度全方位的视角呈现真实的场景&#x…...

VScode远程不用再输入密码操作

安装插件remote development 1.先检查自己电脑上有没有生成一对公钥和私钥。&#xff08;一般会在这个目录&#xff09; 如果没有的话就自己生成一下。 打开命令行输入以下命令 ssh-keygen -t rsa2.在虚拟机中先看一下有没有公钥和私钥。如果没有的话就自己生成一下。 打开…...

MyBatis基本用法-@TableId

TableId 注解是 MyBatis Plus 框架中用于标识实体类中的主键字段的注解&#xff0c;它有一些可选的配置项。下面是详细说明&#xff1a; 首先&#xff0c;需要在项目中添加 MyBatis Plus 的依赖。可以在项目的 pom.xml 文件中添加以下代码&#xff1a; <dependency><…...

React AntDesign写一个导出数据的提示语 上面有跳转的路径,或者点击知道了,关闭该弹层

效果如下&#xff1a; 代码如下&#xff1a; ForwardDataCenterModal(_blank);export const ForwardDataCenterModal (target?: string) > {let contentBefore React.createElement(span, null, 数据正在处理中&#xff0c;请稍后前往);let contentAfter React.creat…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...