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

Java补充(Java8新特性)(和IO都很重要)

一、Lambda表达式

1.1、为什么使用Lambda表达式 Lambda表达式起步案例

下面源码注释是传统写法,代码是简写表达式写法

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.function.Consumer;/*
* 学什么?
*   1、Lambda表达式
*   2、Stream API
*   3、Optional类 NullPointerException
* 目前存在的问题?
*   方法不能作为参数传递
* 如何解决这个问题?
*   行为参数化
* */
public class MyTest02 {public static void main(String[] args) {//匿名内部类/*Thread th1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("hello Java8");}});th1.start();*/Thread th1 = new Thread(() -> {System.out.println("hello Java8");});th1.start();ArrayList<String> list = new ArrayList<String>();list.add("111111");list.add("11");list.add("11222");list.add("1");/*Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {//return o1.length() - o2.length();return Integer.compare(o1.length(), o2.length());}});*/// -> 后省略了大括号和return 还有o1,o2的StringCollections.sort(list, (o1,o2) -> Integer.compare(o1.length(), o2.length()));System.out.println(list);/*list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {//s -- 每次被遍历到的元素System.out.println(s);}}); 下面是简写后的*/list.forEach(s -> System.out.println(s));list.forEach(System.out::println);}
}

1.2、Lambda表达式写法

Lambda表达式是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格。使Java的语言表达能力得到了提升。

语法:

Lambda表达式操作符或箭头操作符:->

左侧:指定了Lambda表达式需要的参数列表(其实就是接口中的抽象方法的形参列表)

右侧:指定了Lambda体,是抽象方法的实现逻辑,也即Lambda表达式要执行的功能(其实就是重写的抽象方法的方法体)。

先把匿名内部类的对象找出来,再看方法参数和方法体

即源码

package day33;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.function.Consumer;/*
* 学什么?
*   1、Lambda表达式
*   2、Stream API
*   3、Optional类 NullPointerException
* 目前存在的问题?
*   方法不能作为参数传递
* 如何解决这个问题?
*   行为参数化
* Lambda表达式
*   -> Lambda操作符或箭头操作符
*   左侧:方法的参数列表
*   右侧:方法的方法体
*   方法:重写的方法
* Lambda表达式简写/进阶写法
*   1、如果参数列表没有参数,要写成()
*   2、如果参数列表有参数
*     参数个数>=2 (数据类型1 参数名1,数据类型2 参数名2,数据类型3 参数名3)
*     参数个数>=2 (参数名1, 参数名2,参数名3) !!!!!
*     只有一个参数 (数据类型 参数名)
*     只有一个参数 (参数名)
*     只有一个参数 参数名 !!!!!
*   3、右侧 - 如果方法体有多行代码,必需写{}
*   4、右侧 - 如果方法体只有一行代码,不用写{},不用写return,不用写结尾的";"* */
public class MyTest02 {public static void main(String[] args) {//匿名内部类/*Thread th1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("hello Java8");}});th1.start();*/Thread th1 = new Thread(() -> {System.out.println("hello Java8");});th1.start();ArrayList<String> list = new ArrayList<String>();list.add("111111");list.add("11");list.add("11222");list.add("1");/*Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {//return o1.length() - o2.length();return Integer.compare(o1.length(), o2.length());}});*/// -> 后省略了大括号和return 还有o1,o2的StringCollections.sort(list, (o1,o2) -> Integer.compare(o1.length(), o2.length()));System.out.println(list);/*list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {//s -- 每次被遍历到的元素System.out.println(s);}}); 下面是简写后的*/list.forEach(s -> System.out.println(s));list.forEach(System.out::println);}
}

1.3、函数式接口_@Functional注解

@FunctionalInterface
@Override
作用:编译器帮我们检查标注了该注解的接口是不是函数式接口|-- 是 -- 编译通过|-- 不是 -- 无法编译通过注意:该注解的作用只是检查的作用,可以不写

相关源码显示:

package day33;public class MyTest03 {public static void aaa(MyInterface a, int m , int n) {a.test(m,n);}public static void main(String[] args) {/*aaa(new MyInterface() {@Overridepublic void test(int a, int b) {System.out.println(a + ":" + b);}},1,2);*/aaa((a,b) -> System.out.println(a + ":" + b),1,2);}
}
package day33;@FunctionalInterface
public interface MyInterface {void test(int a , int b);//唯一的一个抽象方法
}

———————自己定义的,Java官方也有

1.4、函数式接口_常见函数式接口说明

1.5、复合的Lambda表达式

 比较器复合 和 谓词复合

package day34;import java.util.ArrayList;
import java.util.Comparator;
import java.util.function.Predicate;//比较器复合
public class MyTest02 {public static void main(String[] args) {ArrayList<Apple> list = new ArrayList<>();list.add(new Apple(150,"red"));list.add(new Apple(210,"red"));list.add(new Apple(300,"yellow"));list.add(new Apple(90,"green"));list.add(new Apple(90,"yellow"));list.add(new Apple(100,"green"));list.add(new Apple(123,"red"));//按照重量降序排序//list.sort(Comparator.comparing(Apple::getWeight).reversed());//按照重量降序排序,如果重量相同那就按照颜色的升序排序/*list.sort(Comparator.comparing(Apple::getWeight).reversed().thenComparing(Apple::getColor));*///.thenCompareing(Comparator.comparing(Apple::getColor).reversed()));//list.removeIf(item -> item.getWeight() == 90);//删除颜色不是红颜色的苹果 Predicate的复合即谓词复合Predicate<Apple> redApple = item -> item.getColor().equals("red");//list.removeIf(redApple.negate());//去除红颜色并且重量大于150的苹果list.removeIf(redApple.and(item -> item.getWeight() > 150));//去除红色并且重量大于150的苹果或绿苹果list.removeIf(redApple.and(item -> item.getWeight() > 150).or(item -> item.getColor().equals("green")));list.forEach(System.out::println);}
}

二、方法引用

1、本质:就是Lambda表达式,对Lambda表达式的简写

2、比如类名::方法名,一般带两个冒号的就是

 什么情况下Lambda表达式可以改成方法引用?

1)Lambda表达式的方法体只有一行代码,并且只调用了一个方法

2)除了参数列表和1)中的"一个方法",没有再引入其他的额外的内容

三、Stream_中间操作

3.1、filter 过滤符合条件的

package day34;import java.util.ArrayList;public class MyTest04 {public static void main(String[] args) {//filter -- 中间操作ArrayList<String> list = new ArrayList<>();list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");//在控制台打印长度大于2的字符串list.stream().filter(item -> item.length() > 2) //--> Stream.forEach(System.out::println);System.out.println("--------------------------------");System.out.println(list);}
}

3.2、distinct 去重

import java.util.ArrayList;public class MyTest04 {public static void main(String[] args) {//filter -- 中间操作ArrayList<String> list = new ArrayList<>();list.add("Aqaa");list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");//在控制台打印长度大于2的字符串/*list.stream().filter(item -> item.length() > 2) //--> Stream.forEach(System.out::println);System.out.println("--------------------------------");
*///去除重复list.stream().distinct() //根据元素的equals和hashCode方法判断是否重复.forEach(System.out::println);System.out.println("--------------------------------");ArrayList<Apple> list1 = new ArrayList<>();list1.add(new Apple(150,"red"));list1.add(new Apple(210,"red"));list1.add(new Apple(300,"yellow"));list1.add(new Apple(90,"green"));list1.add(new Apple(90,"yellow"));list1.add(new Apple(90,"yellow"));list1.add(new Apple(100,"green"));list1.add(new Apple(123,"red"));list1.stream().distinct().forEach(System.out::println);}
}

3.3、limit 截断流 使其元素不超过给定数量

System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");list1.stream().limit(3).forEach(System.out::println);

3.4、skip 跳过元素,返回一个扔掉了前n个元素的流,若元素不足n个,返回空流

 list1.stream().skip(3).forEach(System.out::println);

3.5、map 映射 将流中的每个元素进行转换

3.5.1、传统做法

package day34;import java.util.ArrayList;
import java.util.LinkedHashSet;public class MyTest05 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Aqaa");list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");//map - 映射 - 将流中的每个元素进行转换//获取list中每个字符串的长度并在控制台打印list.stream()//String.map(s -> s.length())//长度.forEach(System.out::println);System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");//获取list中每个字符串的长度并在控制台打印,去除重复的长度list.stream().map(String::length).distinct().forEach(System.out::println);System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");//传统做法LinkedHashSet<Integer> setLength = new LinkedHashSet<>();for (String s : list) {setLength.add(s.length());}for (Integer len : setLength) {System.out.println(len);}}
}

3.5.2、flatMap 把多个流合并成一个流

System.out.println("__________________________________________");list.stream().mapToInt(String::length).distinct().forEach(System.out::println);ArrayList<String> list1 = new ArrayList<>();list1.add("Hello");list1.add("World"); //H e l l o W o r l dlist1.stream() //String.map(s -> s.split("")) //String --> String[].flatMap(arr -> Arrays.stream(arr)) //String[] --> Stream -->Stream合并.forEach(System.out::println);/* 传统的 上面的是新的String[] arr = "hahaha".split("");System.out.println(Arrays.toString(arr));*/

四、Stream_终端操作

补forEach:没有返回值

4.1、allMatch_anyMatch_noneMatch

package day34;import java.util.ArrayList;public class MyTest06 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Aqaa");//list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");boolean flag = list.stream().allMatch(s -> s.length() > 2); //判断所有元素是否达到要求System.out.println(flag);boolean flag1 = list.stream().anyMatch(s -> s.length() > 2); //判断是否有元素是否达到要求System.out.println(flag1);boolean flag2 = list.stream().noneMatch(s -> s.length() > 2); //判断没有任何元素达到要求System.out.println(flag2);}
}

4.2、findFirst_findAny

package day34;import java.util.ArrayList;
import java.util.Optional;public class MyTest06 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Aqaa");//list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");boolean flag = list.stream().allMatch(s -> s.length() > 2); //判断所有元素是否达到要求System.out.println(flag);boolean flag1 = list.stream().anyMatch(s -> s.length() > 2); //判断是否有元素是否达到要求System.out.println(flag1);boolean flag2 = list.stream().noneMatch(s -> s.length() > 2); //判断没有任何元素达到要求System.out.println(flag2);Optional<String> first = list.stream().findFirst(); //获取第一个元素System.out.println(first.get());Optional<String> any = list.stream().findAny(); //获取任意一个元素System.out.println(any.get());}
}

4.3、reduce

!!!!!归约!!!!!

之前见到过的终端操作都是返回一个boolean(allMatch之类的)、void(forEach)或Optional对象(findAny)等。使用reduce操作来表达更复杂的查询,此类查询需要将流中所有元素反复结合起来,得到一个值,比如一个Integer.这样的查询可以被归类为归约操作(将流归约成一个值)

package day34;import java.util.Arrays;
import java.util.Optional;public class MyTest07 {public static void main(String[] args) {Integer[] arr = new Integer[]{1,2,3};/*Integer sum = Arrays.stream(arr).reduce(0, (n1, n2) -> n1 + n2);*//*Integer sum = Arrays.stream(arr).reduce(0, (n1, n2) -> Integer.sum(n1, n2));*/Integer sum = Arrays.stream(arr).reduce(0, Integer::sum);System.out.println(sum);System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");Optional<Integer> sum1 = Arrays.stream(arr).reduce(Integer::sum);System.out.println(sum1.get());//最大值/*Integer max = Arrays.stream(arr).reduce(arr[0], (n1, n2) -> {if (n1 > n2) {return n1;} else {return n2;}});*//* Integer max = Arrays.stream(arr).reduce(arr[0], (n1, n2) -> n1 > n2 ? n1 : n2);*//*Integer max = Arrays.stream(arr).reduce(arr[0], (n1, n2) -> Integer.max(n1, n2));*/Integer max = Arrays.stream(arr).reduce(arr[0], Integer::max);System.out.println("Max = " + max);Optional<Integer> max1 = Arrays.stream(arr).reduce(Integer::max);//没有起始值的System.out.println("Max1 = " + max1.get());//最小值Integer min = Arrays.stream(arr).reduce(arr[0], Integer::min);System.out.println("Min = " + min);//最佳实践:包装类判断值是否相同要使用equals判断Integer i1 = 1000;Integer i2 = 1000;System.out.println(i1 == i2);//不行System.out.println(i1.equals(i2));}
}

 小练习:

怎样用map 和 reduce 方法计算流中元素的数据。

 //计算流中的元素个数//把元素值都变成1,累加起来即为sumInteger count = Arrays.stream(arr).map(item -> 1).reduce(0, Integer::sum);System.out.println(count);

4.4、sorted

package day34;import java.util.ArrayList;
import java.util.Comparator;public class MyTest08 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Aqaa");//list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");list.stream().sorted() //自然排序.forEach(System.out::println);System.out.println("==============================================");/*list.stream().sorted((s1, s2) -> Integer.compare(s1.length(), s2.length())).forEach(System.out::println);*/list.stream().sorted(Comparator.comparingInt(String::length).reversed().thenComparing(String::compareTo)).forEach(System.out::println);System.out.println("-----------------------------------------------");System.out.println(list.stream().count());}
}

4.5、Stream的终止操作

终端操作会从流的流水线生成结果。其结果可以是任何不是流的值。例如:List、Integer,甚至是void。

流进行了终止操作后,不能再次使用。

package day35;import java.util.ArrayList;
import java.util.stream.Stream;public class MyTest01 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");Stream<String> stream = list.stream();stream.map(item -> 1).forEach(System.out::println);//流一旦进行了终端操作就不能再重复使用,报错stream.map(item -> 1).forEach(System.out::println);}
}

4.5.1、匹配与查找

package day35;import java.util.ArrayList;
import java.util.Optional;
import java.util.stream.Stream;public class MyTest01 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");System.out.println(list.stream().count());Optional<String> max = list.stream()//.max((s1, s2) -> s1.compareTo(s2));.max(String::compareTo);System.out.println(max.get());}
}

4.6、collect

package day35;import java.util.*;
import java.util.stream.Collectors;public class MyTest02 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Aqaa");list.add("Bssss");list.add("Cwww");list.add("Ddsdd");list.add("Edadc");/*ArrayList<Integer> nums = new ArrayList<>();list.stream().map(String::length).forEach(len -> nums.add(len));System.out.println(nums);*/List<Integer> nums = list.stream().map(String::length).collect(Collectors.toList());//把流当中的元素给搜集到集合里面,并作为元素返回Set<Integer> nums1 = list.stream().map(String::length).collect(Collectors.toSet());//Set方法自动去重,Collectors可省略TreeSet<Integer> num2 = new TreeSet<>(nums1);//合并转换System.out.println(num2);System.out.println(nums1);System.out.println("------------------------------------------------");String s = list.stream().map(str -> str.substring(0, 1)).collect(Collectors.joining("+"));System.out.println(s);//例子:搜集所有参与交易的交易员姓名到一个集合中/*List<String> names = transactions.stream().map(Transaction::getTrader).map(Trader::getName).distinct.collect(Collectors.toList());System.out.println(names);*/}
}

相关文章:

Java补充(Java8新特性)(和IO都很重要)

一、Lambda表达式 1.1、为什么使用Lambda表达式 Lambda表达式起步案例 下面源码注释是传统写法&#xff0c;代码是简写表达式写法 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.function.Consumer;/* * 学什么…...

pycharm debug的时候无法debug到指定的位置就停住不动了

报错大致是这样的&#xff0c;但是直接run没有问题&#xff0c;debug就停住不动了 Traceback (most recent call last): File "/home/mapengsen/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 467, in start_client s.connect((host, port)) Timeou…...

分布式流处理与消息传递——Kafka ISR(In-Sync Replicas)算法深度解析

Java Kafka ISR&#xff08;In-Sync Replicas&#xff09;算法深度解析 一、ISR核心原理 #mermaid-svg-OQtnaUGNQ9PMgbW0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OQtnaUGNQ9PMgbW0 .error-icon{fill:#55222…...

极大似然估计例题——正态分布的极大似然估计

设总体 X ∼ N ( μ , σ 2 ) X \sim N(\mu, \sigma^2) X∼N(μ,σ2)&#xff0c;其中 μ \mu μ 和 σ 2 \sigma^2 σ2 是未知参数&#xff0c;取样本观测值为 x 1 , x 2 , ⋯ , x n x_1, x_2, \cdots, x_n x1​,x2​,⋯,xn​&#xff0c;求参数 μ \mu μ 和 σ 2 \sigma^2 σ…...

Pull Request Integration 拉取请求集成

今天我想要把我创建的项目&#xff0c;通过修改yaml里面的内容&#xff0c;让我在main分支下的其他分支拉取请求的时候自动化测试拉取的内容&#xff0c;以及将测试结果上传到控制台云端。 首先我通过修改yaml文件里面的内容 name: Build and Teston:push:branches:- mainjobs:…...

OS10.【Linux】yum命令

目录 1.安装软件的几种方法 直接编译源代码,得到可执行程序 使用软件包管理器 2.yum yum list命令 参数解释 yum install命令 yum remove命令 下载链接存放的位置 扩展yum源 实验:安装sl小火车命令 sl命令的选项 方法1:man sl 方法2:读源代码 3.更新yum源 查看…...

头歌数据库课程实验(角色管理)

第1关&#xff1a;创建角色 任务描述 本关任务&#xff1a;创建角色 role1localhost。 相关知识 为了完成本关任务&#xff0c;你需要掌握MySQL的角色管理。 角色信息存放在数据库 mysql 的 user 表中。 user 表中字段&#xff1a; Host&#xff1a;可以登陆数据库的主机地…...

【android bluetooth 协议分析 03】【蓝牙扫描详解 1】【扫描关键函数 btif_dm_search_devices_evt 分析】

1. 背景 本篇我们来对 btif_dm_search_devices_evt 函数进行分析. 这是系统性分析 Bluetooth 协议栈中的设备扫描流程时必须厘清的一环。 1. 为什么要单独分析 btif_dm_search_devices_evt 函数&#xff1a; btif_dm_search_devices_evt 是 BTIF 层中处理设备扫描&#xff0…...

SpringBoot使用ThreadLocal保存登录用户信息

Java 多线程,系列文章: 《Java多线程》 《Java创建多线程的3种方法:继承Thread类、实现Runnable接口、实现Callable接口》 《Java多线程的同步:synchronized关键字、Lock接口、volatile关键字》 《Java线程池》 《Java线程池实现秒杀功能》 《SpringBoot使用ThreadLocal保存…...

多模态大语言模型arxiv论文略读(102)

Chat2Layout: Interactive 3D Furniture Layout with a Multimodal LLM ➡️ 论文标题&#xff1a;Chat2Layout: Interactive 3D Furniture Layout with a Multimodal LLM ➡️ 论文作者&#xff1a;Can Wang, Hongliang Zhong, Menglei Chai, Mingming He, Dongdong Chen, Ji…...

Ubuntu系统如何部署Crawlab爬虫管理平台(通过docker部署)

Ubuntu系统如何部署Crawlab爬虫管理平台(通过docker部署) 一、安装docker(ubuntu系统版本20.4) 1、更新apt sudo apt-get update2、安装必要的依赖包 sudo apt-get install ca-certificates curl gnupg lsb-release3、添加 Docker 官方 GPG 密钥(清化大学源) # 添加Docke…...

python常用库-pandas、Hugging Face的datasets库(大模型之JSONL(JSON Lines))

文章目录 python常用库pandas、Hugging Face的datasets库&#xff08;大模型之JSONL&#xff08;JSON Lines&#xff09;&#xff09;背景什么是JSONL&#xff08;JSON Lines&#xff09;通过pandas读取和保存JSONL文件pandas读取和保存JSONL文件 Hugging Face的datasets库Hugg…...

高端装备制造企业如何选择适配的项目管理系统提升项目执行效率?附选型案例

高端装备制造项目通常涉及多专业协同、长周期交付和高风险管控&#xff0c;因此系统需具备全生命周期管理能力。例如&#xff0c;北京奥博思公司出品的 PowerProject 项目管理系统就是一款非常适合制造企业使用的项目管理软件系统。 国内某大型半导体装备制造企业与奥博思软件达…...

【Dv3Admin】工具权限配置文件解析

接口级权限控制是后台系统安全防护的核心手段。基于用户角色、请求路径与方法进行细粒度授权&#xff0c;可以有效隔离不同用户的数据访问范围&#xff0c;防止越权操作&#xff0c;保障系统整体稳定性。 本文解析 dvadmin/utils/permission.py 模块&#xff0c;重点关注其在匿…...

AI炼丹日志-22 - MCP 自动操作 Figma+Cursor 自动设计原型

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

Python爬虫:AutoScraper 库详细使用大全(一个智能、自动、轻量级的网络爬虫)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、AutoScraper概述1.1 AutoScraper介绍1.2 安装1.3 注意事项二、基本使用方法2.1 创建 AutoScraper 实例2.2 训练模型2.3 保存和加载模型2.4 数据提取方法2.5 自定义规则三、高级功能3.1 多规则抓取3.2 分页抓取3.3 代…...

2025.6.1总结

今天又上了一天课&#xff0c;假期三天&#xff0c;上了两天的课&#xff0c;明天还得刷题。利用假期时间上课学习&#xff0c;并没有让我感到有多充实&#xff0c;反而让我感到有些小压抑。 在下午的好消息分享环节&#xff0c;我分享了毕业工作以来的一些迷茫。我不知道自己…...

[嵌入式实验]实验四:串口打印电压及温度

一、实验目的 熟悉开发环境在开发板上读取电压和温度信息使用串口和PC通信在PC上输出当前电压和温度信息 二、实验环境 硬件&#xff1a;STM32开发板、CMSIS-DAP调试工具 软件&#xff1a;STM32CubeMX软件、ARM的IDE&#xff1a;Keil C51 三、实验内容 配置相关硬件设施 &…...

LVS+Keepalived 高可用

目录 一、核心概念 1. LVS&#xff08;Linux Virtual Server&#xff09; 2. Keepalived 二、高可用架构设计 1. 架构拓扑图 2. 工作流程 三、部署步骤&#xff08;以 DR 模式为例&#xff09; 1. 环境准备 2. 主 LVS 节点配置 &#xff08;1&#xff09;安装 Keepali…...

Linux正则三剑客篇

一、历史命令 history 命令 &#xff1a;用于输出历史上使用过的命令行数量及具体命令。通过 history 可以快速查看并回顾之前执行过的命令&#xff0c;方便重复操作或追溯执行过程。 !行号 &#xff1a;通过指定历史命令的行号来重新执行该行号对应的命令。例如&#xff0c;若…...

HTML5 视频播放器:从基础到进阶的实现指南

在现代Web开发中&#xff0c;视频播放功能是许多网站的重要组成部分。无论是在线教育平台、视频分享网站&#xff0c;还是企业官网&#xff0c;HTML5视频播放器都扮演着不可或缺的角色。本文将从基础到进阶&#xff0c;详细介绍如何实现一个功能完善的HTML5视频播放器&#xff…...

鸿蒙HarmonyOS (React Native)的实战教程

一、环境配置 ‌安装鸿蒙专属模板‌ bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ‌配置 ArkTS 模块路径‌ 在 entry/src/main/ets 目录下创建原生模块&…...

函数栈帧深度解析:从寄存器操作看函数调用机制

文章目录 一、程序运行的 "舞台"&#xff1a;内存栈区与核心寄存器二、寄存器在函数调用中的核心作用​三、函数调用全流程解析&#xff1a;以 main 调用 func 为例阶段 1&#xff1a;main 函数栈帧初始化**阶段 2&#xff1a;参数压栈&#xff08;右→左顺序&#x…...

【计算机网络】第3章:传输层—可靠数据传输的原理

目录 一、PPT 二、总结 &#xff08;一&#xff09;可靠数据传输原理 关键机制 1. 序号机制 (Sequence Numbers) 2. 确认机制 (Acknowledgements - ACKs) 3. 重传机制 (Retransmission) 4. 校验和 (Checksum) 5. 流量控制 (Flow Control) 协议实现的核心&#xff1a;滑…...

rv1126b sdk移植

DDR rkbin bin/rv11/rv1126bp_ddr_v1.00.bin v1.00 板子2 reboot异常 [ 90.334976] reboot:Restarting system DDR 950804cb85 wesley.yao 25/04/02-15:54:40,fwver: v1.00In Derate1 tREFI1x SR93 PD13 R ddrconf 4 rgef0 rgcsb0 1 ERR: Read gate CS0 err error ERR …...

第6节 Node.js 回调函数

Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现&#xff0c;但不能说使用了回调后程序就异步化了。 回调函数在完成任务后就会被调用&#xff0c;Node 使用了大量的回调函数&#xff0c;Node 所有 API 都支持回调函数。 例如&#xff0c;我们可以一边读取文…...

OpenCV CUDA模块直方图计算------在 GPU上执行直方图均衡化(Histogram Equalization)函数equalizeHist

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::equalizeHist 用于增强图像的对比度&#xff0c;通过将图像的灰度直方图重新分布&#xff0c;使得图像整体对比度更加明显。 这在医学…...

构建系统maven

1 前言 说真的&#xff0c;我是真的不想看构建了&#xff0c;因为真的太多了。又多又乱。Maven、Gradle、Make、CMake、Meson、Ninja&#xff0c;Android BP。。。感觉学不完&#xff0c;根本学不完。。。 但是没办法最近又要用一下Maven&#xff0c;所以咬着牙再简单整理一下…...

day13 leetcode-hot100-23(链表2)

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 1.迭代 思路 这个题目很简单&#xff0c;最主要的就是了解链表的数据结构。 链表由多个节点构成&#xff0c;每个节点包括值与指针&#xff0c;其中指针指向下一个节点&#xff08;单链表&#xff09;。 方法就是将指…...

Java面试八股(Java基础,Spring,SpringBoot篇)

java基础 JDK,JRE,JVMJava语言的特点Java常见的运行时异常Java为什么要封装​自增自减的隐式转换移位运算符1. 左移运算符&#xff08;<<&#xff09;2. 带符号右移运算符&#xff08;>>&#xff09;3. 无符号右移运算符&#xff08;>>>&#xff09; 可变…...