集合框架拓展--stream流的使用
Stream(JDK8新特性)
什么是Stream?
-
也叫stream流,是JDK8开始新增的一套API(java.util.stream.*),可以用于操作集合或数组中的数据
-
优势:Stream流大量地结合了Lambda的语法风格来编程,提供了一种更强大,更加简单的方式操作集合或者数组的数据,代码更简洁,可读性更好(比如:从集合中筛选数据,遍历数据)
案例:体验stream流
需求:
-
把集合中所有以''张''开头而且是三个字的元素存储到一个新的集合中
代码展示:
package com.lyc.steam;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream;public class Test1 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张三丰","张无忌","周芷若","赵敏");//把集合中所有以''张''开头而且是三个字的元素存储到一个新的集合中//原做法:ArrayList<Object> list1 = new ArrayList<>();list.forEach(s -> {if(s.startsWith("张") && s.length() == 3){list1.add(s);}});System.out.println(list1);//stream流优化:List<String> list2 = list.stream().filter(s -> s.startsWith("张") && s.length() == 3).toList();System.out.println(list2);}}
Stream流的使用步骤
-
获取数据源的stream流,相当于得到了数据源的一条流水线
-
调用流水线的各种中间方法去进行数据处理
-
获取处理的结果,调用一些常见的终结方法
stream的常用方法
获取stream流方法
-
获取集合的Stream流,
Collection提供的如下方法 | 说明 |
---|---|
default Stream <E> stream() | 获取当前对象的stream流 |
-
获得数组的Stream流
Arrays类提供的如下方法 | 说明 |
---|---|
public static <T> Stream<T> stream(T[] array) | 获取当前数组的Stream流 |
Stream类提供的如下方法 | 说明 |
---|---|
public static<T> Stream<T> of(T...values) | 获取当前接受数据的stream流 |
案例展示:
public static void main(String[] args) {//如何获取List集合的stream流?List<String> list = new ArrayList<>();Collections.addAll(list,"张三丰","张无忌","周芷若","赵敏");Stream<String> stream = list.stream();//如何获得Set集合的stream流?Set<String> set = new HashSet<>();Collections.addAll(set,"张三丰","张无忌","周芷若","赵敏");Stream<String> stream1 = set.stream();stream1.filter(s->s.contains("张")).forEach(System.out::println);//如何获得Map集合的stream流?Map<String,Double> map = new HashMap<>();map.put("张三丰",9.9);map.put("张无忌",9.8);map.put("周芷若",9.7);map.put("赵敏",9.6);//map.entrySet()返回的是一个Set集合,所以可以转换为stream流Stream<Map.Entry<String, Double>> stream2 = map.entrySet().stream();stream2.filter(s->s.getValue()>9.5 && s.getKey().contains("张")).forEach(System.out::println);//如何获取数组的数据流String[] arr = {"张三丰","张无忌","周芷若","赵敏"};//直接使用Array工具类的静态方法Stream<String> stream3 = Arrays.stream(arr);//使用Stream工具类Stream<String> arr1 = Stream.of(arr);
Stream流中间方法
-
中间方法是指调用完成后返回新的Stream流,可以继续使用(支持链式编程)
方法名 | 说明 |
---|---|
Stream<T> filter(Predicate predicate) | 用于对流中的数据进行过滤 |
Stream<T> limit(long maxSize) | 获取前几个元素 |
Stream<T> skip(long n) | 跳过前几个元素 |
static <T> Stream<T> concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
Stream<T> distinct() | 去重 |
Stream<T> sorted() | 排序 |
Stream<T> sorted(Comparator comparator) | 根据提供的Comparator进行排序 |
<R> Stream<R> map(Function mapper) | 对元素进行加工,并返回对应的新流 |
IntStream mapToInt(ToIntFunction mapper) | 返回一个IntStream其中包含将给定函数应用于此流的元素的结果 |
代码测试:
public static void main(String[] args) {List<Double> sorces = new ArrayList<>();Collections.addAll(sorces, 88.5, 99.5, 100.0, 60.5, 70.5, 80.5, 90.5, 50.5, 40.5, 30.5, 20.5);//需求1:找出成绩大于六十的学生成绩,并升序后输出 终结方法:foreachsorces.stream().filter(s->s>60).sorted().forEach(System.out::println);System.out.println("----------------------------------------------------------");ArrayList<Student> students = new ArrayList<>();students.add(new Student("张三", 18, 170.7));students.add(new Student("李四", 19, 180.7));students.add(new Student("李四", 19, 180.7));students.add(new Student("王五", 20, 190.7));students.add(new Student("赵六", 21, 200.7));students.add(new Student("钱七", 22, 210.7));students.add(new Student("孙八", 23, 220.7));//需求2:找出年龄大于等于20,小于30的学生,并按照年龄降序排序输出students.stream().filter(s->s.getAge()>=20 && s.getAge()<30).sorted((s1,s2)->s2.getAge()-s1.getAge()).forEach(System.out::println);System.out.println("-------------------------------------------------------");//需求3:找出身高最高的三名学生 limit 方法:限制数量students.stream().sorted((s1,s2)->s2.getHeight().compareTo(s1.getHeight())).limit(3).forEach(System.out::println);System.out.println("------------------------------------------------------------");//需求4:取出身高倒数的2名学生,并输出 skip方法:跳过students.stream().sorted((s1,s2)->s2.getHeight().compareTo(s1.getHeight())).skip(students.size()-2).forEach(System.out::println);System.out.println("------------------------------------------------------------");//需求5:找出身高大于等于180cm的学生的名字,要求去除重复的名字,在输出 map方法:映射,将student对象的name属性映射为字符串 distinct 方法:去重students.stream().filter(s->s.getHeight()>=180).distinct().map(Student::getName).forEach(System.out::println);System.out.println("----------------------------------------------------------------");//distinct()方法:去重,自定义类型的对象,必须重写hashCode()和equals()方法,才能去重students.stream().filter(s->s.getHeight()>=180).distinct().forEach(System.out::println);System.out.println("---------------------------------------------------------");//需求6:合并以下的两个流 concat 方法:连接两个流Stream<String> st1 = Stream.of("张三", "李四", "王五");Stream<String> st2 = Stream.of("赵六", "钱七", "孙八");Stream<String> stream = Stream.concat(st1, st2);stream.forEach(System.out::println);}}
stream流的终结方法
-
终结方法是指调用完成后,不会再返回新的stream流,没法在使用流了
stream提供的常用终结方法 | 说明 |
---|---|
void forEach(Consmer) | 对此流运算后的元素执行便历 |
long count() | 统计此流运算后的元素个数 |
Optional <T> max(Comparator<? super T> Comparator) | 获取此流运算后的最大值元素 |
Optional <T> min(Comparator<? super T> Comparator) | 获取此流运算后的最小值元素 |
-
收集Stream流:就是把Stream流操作后的结果转到集合或者数组中去返回。
-
stream流:方便操作集合/数组的手段 集合/数组:才是开发的目的
stream提供的常用终结方法 说明 R collect(Collector collector)
把流处理后的结果收集到一个指定的集合中去 Object[] toArray()
把流处理后的结果收集到一个数组中去
代码展示:
package com.lyc.steam;import com.lyc.pojo.Student;import java.util.*;import java.util.stream.Collectors;//测试stream流的终结方法public class Test4 {public static void main(String[] args) {ArrayList<Student> students = new ArrayList<>();students.add(new Student("张三", 18, 170.7));students.add(new Student("李四", 19, 180.7));students.add(new Student("李四", 19, 180.7));students.add(new Student("王五", 20, 190.7));students.add(new Student("赵六", 21, 200.7));students.add(new Student("钱七", 22, 210.7));students.add(new Student("孙八", 23, 220.7));//需求1:请计算出身高超过180的学生人数long count = students.stream().filter(s -> s.getHeight() > 180).count();System.out.println(count);System.out.println("-----------------------------------------------");//需求2:找出身高最高的学生对象,并输出Student max = students.stream().max((s1, s2) -> s1.getHeight().compareTo(s2.getHeight())).get();System.out.println(max);System.out.println("-------------------------------------------");//需求3:找出身高最矮的学生对象,并输出Student min = students.stream().min((s1, s2) -> s1.getHeight().compareTo(s2.getHeight())).get();System.out.println(min);System.out.println("----------------------------------------------");//需求4:身高超过190的学生对象,放在一个新的集合中返回// toList()方法:将流中的元素收集到一个List集合中,返回一个List集合//流,只能使用一次,所以不能再使用filter()方法,否则会报错List<Student> students1 = students.stream().filter(s->s.getHeight()>190).toList();Set<Student> collect = students.stream().filter(s -> s.getHeight() > 190).collect(Collectors.toSet());System.out.println(students1);System.out.println(collect);System.out.println("--------------------------------------------------");//需求5:找出身高大于等于190cm的学生对象,并把学生对象的名字和身高,存入到一个Map集合返回。 key:学生姓名,value:学生身高,toMap()方法:将流中的元素收集到一个Map集合中,返回一个Map集合Map<String, Double> map = students.stream().filter(s -> s.getHeight() >= 170).distinct().collect(Collectors.toMap(Student::getName, Student::getHeight));System.out.println(map);System.out.println("----------------------------------------------");//需求6:找出身高大于等于180cm的学生对象,并把学生对象的名字存入到一个数组返回。String[] array = students.stream().filter(s -> s.getHeight() >= 180).map(Student::getName).toArray(len->new String[len]);System.out.println(Arrays.toString(array));}}
注:流只能收集一次,不要想着将重复的流代码抽取封装成工具,会报错
流只是我们用来简化代码的工具,只是手段,变成集合/数组才是目的!
希望对大家有所帮助!
相关文章:
集合框架拓展--stream流的使用
Stream(JDK8新特性) 什么是Stream? 也叫stream流,是JDK8开始新增的一套API(java.util.stream.*),可以用于操作集合或数组中的数据 优势:Stream流大量地结合了Lambda的语法风格来编程ÿ…...
Beszel 轻量级服务器监控平台的详细安装步骤
什么是 Beszel Beszel 是一个轻量级的服务器监控平台,包含 Docker 统计信息、历史数据和警报功能。 它拥有友好的 Web 界面、简单的配置,并且开箱即用。它支持自动备份、多用户、OAuth 身份验证和 API 访问 https://beszel.dev/zh/guide/what-is-besz…...
Spring 微服务解决了单体架构的哪些痛点?
1. 部署困难 (Deployment Difficulty & Risk) 单体痛点: 整体部署: 对单体应用的任何微小修改(哪怕只是一行代码),都需要重新构建、测试和部署整个庞大的应用程序。部署频率低: 由于部署过程复杂且风险高,发布周期通常很长&a…...
Kotlin delay方法解析
本文记录了kotlin协程(Android)中delay方法的字节码实现,并解析了delay方法如何实现挂起操作。 一、delay方法介绍 1.1、delay方法使用举例 class TestDelay {suspend fun testDelay() {Log.d("TestDelay", "before delay")delay(1000)Log.d…...
C# 类型、存储和变量(用户定义类型)
本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 用户定义类型 除了C#提供的16种预定义类型,还可以创建自己的用户定义类型。有6种类型可以…...
C语言之高校学生信息快速查询系统的实现
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之高校学生信息快速查询系统的实现 目录 任务陈述与分析 问题陈述问题分析 数据结构设…...
Windows串口通信
Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…...
从零开始用Pytorch实现LLaMA 4的混合专家(MoE)模型
近期发布的LLaMA 4模型引入了混合专家(Mixture of Experts, MoE)架构,旨在提升模型效率和性能。尽管社区对LLaMA 4的实际表现存在一些讨论,但MoE作为一种重要的模型设计范式,继Mistral等模型之后再次受到关注。 所以我…...
python3GUI--仿网课答题播放器 By:PyQt5(分享)
文章目录 一.前言二.相关知识1.PyQt52.QMediaPlayer3.QThread4.Sqlite3 二.展示1.主界面2.课程播放&问答3.字幕调整4.播放列表折叠5.添加课程 三.心得与分享1.数据本地化2.自定义组件3.系统流程图与代码量4.免责声明 四&#…...
Python基础总结(八)之循环语句
文章目录 一、for循环1.1 for循环格式1.2 for ...else1.3 for...break1.4 for...continue 二、while循环2.1 while循环格式2.2 while...break2.3 while...continue2.4 while ...else 循环语句就如其名,就是重复的执行一段代码,直到满足退出条件时&#x…...
21. git apply
基本概述 git apply 的作用是:应用补丁文件 基本用法 1.命令格式 git apply [选项] <补丁文件>2.应用补丁 git apply patchfile.patch将补丁应用到工作目录,但不会自动添加到暂存区(需手动 git add) 常用选项 1.检查…...
第一章:MySQL视图基础
1. 视图是什么? 定义:视图(View)是一种虚拟表,其内容基于一个或多个真实表(基表)的查询结果。视图不实际存储数据,而是通过查询动态生成数据。核心特点:…...
深入理解基线检查:网络安全的基石
深入理解基线检查:网络安全的基石 一、引言 在信息技术飞速发展的今天,网络安全已成为企业和组织正常运营的关键保障。从日常办公系统到关键业务应用,任何环节的安全漏洞都可能导致严重的后果,如数据泄露、系统瘫痪等。基线检查作…...
33-公交车司机管理系统
技术: 基于 B/S 架构 SpringBootMySQLvueelementui 环境: Idea mysql maven jdk1.8 node 用户端功能 1.首页:展示车辆信息及车辆位置和线路信息 2.模块:车辆信息及车辆位置和线路信息 3.公告、论坛 4.在线留言 5.个人中心:修改个人信息 司机端功能…...
【AI实践】使用DeepSeek+CherryStudio绘制Mermaid格式图表
目录 工具准备创建DeepSeek API Key安装CherryStudioMermaid在线编辑器 绘制图表编写提示词在CherryStudio中调用DeepSeek复制源码到Mermaid编辑器中进行微调 图表示例流程图思维导图甘特图 工具准备 创建DeepSeek API Key 打开DeepSeek开放平台, 注册并充值成功后…...
TCP报文段解析:从抽象到具象的趣味学习框架
TCP报文段解析:从抽象到具象的趣味学习框架 一、What:TCP报文段长什么样? 核心结构(类比快递包裹): 复制 下载 | 源端口(16位)| 目的端口(16位)| |-----…...
B+树节点与插入操作
B树节点与插入操作 设计B树节点 在设计B树的数据结构时,我们首先需要定义节点的格式,这将帮助我们理解如何进行插入、删除以及分裂和合并操作。以下是对B树节点设计的详细说明。 节点格式概述 所有的B树节点大小相同,这是为了后续使用自由…...
rollup使用讲解
rollup 总结 什么是 rollup? rollup 是一个 JavaScript 模块打包器,在功能上要完成的事和 webpack 性质一样,就是将小块代码编译成大块复杂的代码,例如 library 或应用程序。在平时开发应用程序时,我们基本上选择用 webpack,相比之下,rollup.js 更多是用于 library 打…...
高边开关和低边开关的区别
高边驱动和低边驱动的区别 在高边驱动和低边驱动中,开关的位置直接影响电路在负载短路时的安全性和电流路径。以下是关键原理的分步解释: 1. 高低边驱动的结构对比 高边驱动(High-Side Drive) 电路结构: 电源正极 →…...
PG psql --single-transaction 参数功能
文章目录 PG psql --single-transaction 参数功能 PG psql --single-transaction 参数功能 test.sql 文件 create table test1(id int); CREATE OR REPLACE FUNCTION func_test() RETURNS INTEGER AS $BODY$ BEGINxxxreturn 0; END; $BODY$ LANGUAGE plpgsql VOLATILE CALLE…...
C++ 多态
1.多态的概念 多态(polymorphism)通俗来说就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点是运行时多态,编译时多态主要就是我们前面的函数重载和…...
【matlab|python】矢量棍棒图应用场景和代码
【matlab|python】矢量棍棒图应用场景和代码 矢量棍棒图的介绍和作用 矢量棍棒图(stick plot)是一种用于可视化 方向性时间序列数据 的图形工具。它常用于大气科学和海洋科学中,以直观地展示 风场、海流 或 其他矢量变量 随时间的变化情况。 …...
Matlab 五相电机仿真
1、内容简介 Matlab 208-五相电机仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
计算机视觉cv2入门之视频处理
在我们进行计算机视觉任务时,经常会对视频中的图像进行操作,这里我来给大家分享一下,如何cv2中视频文件的操作方法。这里我们主要介绍cv2.VideoCapture函数的基本使用方法。 cv2.VideoCapture函数...
力扣每日一题781题解-算法:贪心,数学公式 - 数据结构:哈希
https://leetcode.cn/problems/rabbits-in-forest/description/?envTypedaily-question&envId2025-04-20 781.推测兔子数 算法:贪心,数学公式 数据结构:哈希 用哈希存每个兔子报告的同色数量,作为key,同个key…...
MAC-QueryWrapper中用的exists,是不是用join效果更好
在使用MyBatis-Plus的QueryWrapper中的exists方法时,是否改为使用join效果会更好,以及如何 修改。这涉及到SQL优化和MyBatis-Plus的用法。 首先,需要理解exists和join在SQL中的区别。exists用于检查子查询是否返回结果,而join则是将 两个表连接起来,根据某些条件合并行…...
使用 Visual Studio 2022 中的 .http 文件
转自微软技术文档: https://learn.microsoft.com/zh-cn/aspnet/core/test/http-files?viewaspnetcore-9.0 Visual Studio 2022.http 文件编辑器提供了一种便捷的方式来测试 ASP.NET Core项目,尤其是 API 应用。 编辑器提供一个 UI,用于&am…...
相得益彰 — 基于 GraphRAG 事理图谱驱动的实时金融行情新闻资讯洞察
*本文为亚马逊云科技博客文章,仅用于技术分享,不构成投资建议或金融决策支持。文中涉及的公司名称仅用于技术示例,不代表亚马逊云科技观点或与这些公司的商业合作关系。 背景介绍 在当今这个信息爆炸的时代,金融市场每天都在产生…...
为什么this与super不能出现在同一构造器的原因
在 Java 中,this() 和 super() 不能同时出现在同一个构造器中,因为它们都必须作为构造器的第一条语句,而一个构造器的第一条语句只能有一个。以下是详细解释和示例: ⚠️ 核心规则 只能二选一: 每个构造器的第一条语句…...
Linux:网络基础
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:网络基础》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!…...
C++入门篇(下)
目录 1、引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.4.1 引用做参数 1.4.2 引用做返回值 1.5 引用和指针的区别 2、内联函数 2.1 概念 2.2 特性 3、auto关键字 4、基于范围的for循环 5、指针空值nullptr 5.1 C98 中的指针空值处理 5.2 C11 …...
QCustomPlot中自定义QCPAbstractPlottable绘图元素
QCPAbstractPlottable 是 QCustomPlot 中所有可绘制图形(如曲线、柱状图等)的基类。要创建自定义的绘图元素,通常需要继承这个类并实现其纯虚函数。 基本步骤 继承 QCPAbstractPlottable 实现必要的纯虚函数 添加自定义属性和方法 注册到 QCustomPlot 系统 完…...
【Bluedroid】蓝牙 HID 设备信息加载与注册机制及配置缓存系统源码解析
本篇解析Android蓝牙子系统加载配对HID设备的核心流程,通过btif_storage_load_bonded_hid_info实现从NVRAM读取设备属性、验证绑定状态、构造描述符并注册到BTA_HH模块。重点剖析基于ConfigCache的三层存储架构(全局配置/持久设备/临时设备)&…...
【计算机视觉】CV实战项目 - PCC-Net 人群计数
PCC-Net 人群计数项目 项目特点项目运行方式与步骤1. 环境准备2. 数据准备3. 模型训练4. 实验结果 常见问题及解决方法 PCC-Net(Perspective Crowd Counting via Spatial Convolutional Network)是一个用于人群计数的深度学习项目,旨在通过空…...
Towards Transferable Targeted 3D Adversarial Attack in the Physical World--阅读笔记
目录 简介: 背景: 挑战: 目的: 技术细节: 贡献: 1. NeRF的核心作用:3D重建与参数化表示 2. 对抗优化的创新:NeRF参数空间的双优化 2.1 传统方法的局限…...
opencv图像库编程
一、下载安装 opencv 1.1 下载安装包 1.2 解压缩 unzip opencv-3.4.11.zip 解压缩以后主目录文件夹如下: 1.3 进入到解压后的文件夹中 cd opencv-3.4.11 二、使用 cmake安装opencv 2.1 进入 root 用户,并更新一下 sudo su sudo apt-get update …...
星拍相机APP:时尚与科技的完美融合,打造你的专属美
在数字时代,手机相机不仅是记录生活的工具,更是表达个性和创意的平台。今天,我们要介绍的 星拍相机APP,就是这样一款匠心制作的手机相机应用。它融合了时尚与科技,提供了多样化的魔法美颜功能,让每一次拍摄…...
puzzle(0531)脑力航迹
目录 脑力航迹 规则 解法 简单模式 中等模式 困难模式 专家模式 脑力航迹 规则 2条航迹会产生一个相对航迹: 根据相对航迹和其中一个航迹推导另外一个航迹。 解法 没有任何需要推理的地方,就是纯粹的2个矢量相加。 简单模式 中等模式 困难模…...
【英语语法】词法---形容词
目录 形容词1. 形容词的核心功能2. 形容词的位置(1) 前置定语(最常见)(2) 后置定语(特殊情况)(3) 表语位置(系动词后) 3. 形容词的比较级与最高级(1) 规则变化(2) 不规则变化(3) 用法对比 4. 多个形容词修饰…...
理解 React 的 useEffect
文章目录 React 的 useEffect一、什么是副作用(Side Effects)?二、useEffect 的基本用法三、依赖数组的三种情况1. 无依赖数组(每次渲染后都执行, 不推荐)2. 空依赖数组(仅在挂载时执行一次)3. …...
2.1 基于委托的异步编程方法
基于委托的异步编程模型是 .NET 早期版本中实现异步操作的一种方式,主要通过 BeginInvoke 和 EndInvoke 方法来实现。这种基于委托的异步模式已被 Task 和 async/await 模式取代,但在维护旧代码时仍可能遇到这种模式。 委托的方法中:Invoke用于同步调用; 而BeginInvoke与E…...
对于在线教育或知识付费类网站视频处理方案
一、视频格式: 1. 推荐格式:HLS(HTTP Live Streaming) 优势: 自适应码率:根据用户网络状况自动切换清晰度,避免卡顿。广泛兼容性:iOS/macOS 原生支持,Android…...
Gen - CDPT举例说明:动态上下文前缀(输入先和标签结合,输出结果会更贴近标签内容)
Gen - CDPT举例说明:动态上下文前缀(输入先和标签结合,输出结果会更贴近标签内容) 目录 Gen - CDPT举例说明:动态上下文前缀(输入先和标签结合,输出结果会更贴近标签内容)输入文本示例Gen - CDPT模型处理过程示例什么是:提示次优动态前缀提示方法生成与这条评论上下文…...
UCSC CTF 2025|MISC
1、USB flag{ebdfea9b-3469-41c7-9070-d7833ecc6102} 2、three part1是图片隐水印 part1:8f02d3e7 part2是2进制变换 -ce89-4d6b-830e- Part3先从pass.pcapng得到密码字典 解压缩密码:thinkbell 3个部分合并得到flag{8f02d3e7-ce89-4d6b-830e-5d0cb5…...
FTP客户端实现(文件传输)
文章目录 🧱 一、FTP 基础架构回顾🚀 二、FTP 客户端的核心结构🔗 三、连接与登录过程📌 1. ftp_create()📌 2. ftp_connect()📌 3. ftp_login() 📁 四、上传文件实现(ftp_upload_fi…...
状态管理最佳实践:Bloc架构实践
状态管理最佳实践:Bloc架构实践 引言 Bloc (Business Logic Component) 是Flutter中一种强大的状态管理解决方案,它基于响应式编程思想,通过分离业务逻辑和UI表现层来实现清晰的代码架构。本文将深入探讨Bloc的核心概念、实现原理和最佳实践…...
嵌入式人工智能应用-第三章 opencv操作 5 二值化、图像缩放
嵌入式人工智能应用 嵌入式人工智能应用-第三章 opencv操作 5 二值化 嵌入式人工智能应用1 二值化1.1 概念介绍1.2 函数介绍1.2 基本应用1.3 参考案例 2 图像缩放2.1 基本概念2.2 函数介绍2.3 基本参考代码2.4 pyrUp 和 pyrDown 函数2.5 函数介绍2.6 参考代码2.7 总结 1 二值化…...
[OS_7] 访问操作系统对象 | offset | FHS | Handle
实验代码可以看去年暑假的这篇文章:【Linux】进程间通信:详解 VSCode使用 | 匿名管道 我们已经知道,进程从 execve 后的初始状态开始,可以通过 mmap 改变自己的地址空间,通过 fork 创建新的进程,再通过 exe…...
【Vulkan 入门系列】创建帧缓冲、命令池、命令缓存,和获取图片(六)
这一节主要介绍创建帧缓冲(Framebuffer),创建命令池,创建命令缓存,和从文件加载 PNG 图像数据,解码为 RGBA 格式,并将像素数据暂存到 Vulkan 的 暂存缓冲区中。 一、创建帧缓冲 createFramebu…...
Linux 进程控制(自用)
非阻塞调用waitpid 这样父进程就不会阻塞,此时循环使用我们可以让父进程执行其他任务而不是阻塞等待 进程程序替换 进程PCB加载到内存中的代码和数据 替换就是完全替换当前进程的代码段、数据段、堆和栈,保存当前的PCB 代码指的是二进制代码不是源码&a…...