做网站视频教程/附近有学电脑培训班吗
一、概述
记录时间 [2024-08-16]
前置知识:Java 基础篇;Java 面向对象
多线程 01:Java 多线程学习导航,线程简介,线程相关概念的整理
多线程 02:线程实现,创建线程的三种方式,通过多线程下载图片案例分析异同(Thread,Runnable,Callable)
Java 多线程学习主要模块包括:线程简介;线程实现;线程控制;线程状态;线程同步;线程通信问题;拓展高级主题。
本文是针对多线程的相关知识补充:静态代理与 Lambda
表达式。
文章通过婚庆公司代理婚礼策划的案例讲解了静态代理这一模式,并类比了 Thread
类代理 Runnable
接口启动多线程的方式。
此外,文章通过对内部类的简化,进行 Lambda
表达式的推导,并介绍了 Lambda
表达式的使用方式和注意点,同时类比 Runnable
接口这个函数式接口,讲述如何使用 Lambda
表达式创建 Runnable
对象。
二、静态代理
静态代理是一种设计模式,常用于 Java 中实现面向切面编程(AOP)、装饰者模式等。
在静态代理中,代理类是在编译时就已经定义好的,并且与被代理的对象具有相同的接口。
代理类可以用来包装真实对象的方法调用,从而可以在调用前后添加额外的操作。
1. 基本结构
静态代理通常包含以下几个部分:
- 接口:定义了真实对象和代理对象都需要实现的方法。
- 真实对象:实现了接口,提供了实际业务逻辑。
- 代理对象:也实现了相同的接口,内部包装了真实对象,并在其方法调用前后添加额外的行为。
2. 案例分析
我们可以使用静态代理模式来模拟结婚与婚庆公司的行为。
在这个例子中,假设某人要举办一场婚礼,他需要婚庆公司来帮忙安排婚礼策划的各个方面。
- 婚礼策划:看作一个接口,真实对象和代理对象都需要实现这个接口;
- 某人:真实对象,结婚当事人;
- 婚庆公司:代理对象,代理某人,帮忙安排婚礼策划的各个方面。
定义接口
首先,我们定义一个 Marry
接口,它表示婚礼策划服务。同时定义一个 HappyMarry()
方法。
interface Marry {// 人间四大喜事// 久旱逢甘霖,他乡遇故知,洞房花烛夜,金榜题名时。void HappyMarry();
}
创建真实对象
创建一个 Person
类,它代表真实对象,需要实现 Marry
接口,并实现接口中的方法。
// 真实角色,结婚当事人
class Person implements Marry {@Overridepublic void HappyMarry() {System.out.println("某人要结婚了,超开心");}
}
创建代理对象
创建一个 WeddingCompany
类,它是代理角色,帮助目标对象安排婚礼策划的各个方面。
代理类也需要实现 Marry
接口,并实现接口中的方法。
同时,代理类中包装了一个真实的 Marry
对象。代理类将在计划婚礼前后添加额外的行为,比如咨询、准备和清理工作。
- 婚礼之前,布置现场;
- 婚礼之后,清理工作。
// 代理角色,帮助目标对象安排婚礼策划的各个方面
class WeddingCompany implements Marry {// 包装一个真实的结婚对象private Marry target;public WeddingCompany(Marry target) {this.target = target;}@Overridepublic void HappyMarry() {before();// 实际上是某人要结婚this.target.HappyMarry();after();}private void before() {System.out.println("婚礼之前,布置现场");}private void after() {System.out.println("婚礼之后,清理工作");}}
使用代理对象
最后,我们在主程序中使用代理对象来调用 HappyMarry()
方法。
在代理对象中传入真实对象,然后调用方法。
public class WeddingDemo {public static void main(String[] args) {// 真实对象Person person = new Person();// 代理对象WeddingCompany proxy = new WeddingCompany(person);// // 代理对象调用方法proxy.HappyMarry();// 合起来写// new WeddingCompany(new Person()).HappyMarry();}
}
输出结果
当运行 WeddingDemo
类时,输出应该是这样的:
婚礼之前,布置现场
某人要结婚了,超开心
婚礼之后,清理工作
3. 注意事项
静态代理模式总结:
- 真实对象和代理对象都要实现同一个接口;
- 代理对象要代理真实角色。
静态代理模式的优点:
- 代理对象可以做很多真实对象做不了的事情;
- 真实对象专注做自己的事情。
4. 类比多线程代理
在 Java 中,通过 Thread
类代理 Runnable
接口启动多线程是一种常见的模式。
这种模式类似于静态代理模式,这里的代理行为由 Thread
类完成的。
在这个模式中,Thread
类扮演了代理的角色,它代理了 Runnable
接口的实现,并且负责启动线程。我们可以将 Thread
类看作是代理类,它包装了一个实现了 Runnable
接口的对象,并在适当的时机调用其run()
方法。
- 接口:
Runnable
接口,定义了线程执行的行为。 - 真实对象:实现了
Runnable
接口的类,提供了实际要执行的任务。 - 代理对象:
Thread
类,它代理了Runnable
接口的实现,并负责启动和管理线程。
例如:
// lambda 表达式
new Thread( ()-> System.out.println("线程") ).start();
三、Lambda 表达式
Lambda
表达式是 Java 8 引入的一项重要功能,它允许定义简洁的一次性使用的函数。
Lambda
表达式简化了代码的编写,通常用于实现函数式接口(只有一个抽象方法的接口)。
对于函数式接口,可以通过 Lambda
表达式来创建该接口的对象。
1. 基本概念
语法格式
Lambda
表达式的语法格式如下:
parameters
:参数列表。->
:箭头符号,表示参数列表之后跟着的是主体部分。expression
或{ statements; }
:主体部分,可以是一个表达式或一组语句。
(parameters) -> expression// 或者
(parameters) -> {statements; // statements2;
}
参数
无参数的 Lambda
表达式:
// () -> System.out.println("Hello, Lambda!");
Runnable task = () -> System.out.println("Hello, Lambda!");
task.run();
单参数的 Lambda
表达式:
// (int a) -> System.out.println("Hello, Lambda!" + a);
Runnable task = (int a) -> System.out.println("Hello, Lambda!" + a);
task.run();
多参数的 Lambda
表达式:
// (int a, int b) -> System.out.println("...");
Runnable task = (int a, int b) -> System.out.println("Hello, Lambda!" + a);
task.run();
注意事项
Lambda
表达式使用前提:接口为函数式接口。- 如果
Lambda
表达式的主体部分只有一个表达式,可以不用{}
包裹;多行代码需要用{}
包裹,表示为一个整体的代码块。 - 如果
Lambda
表达式的参数列表中只有一个参数时,括号、参数类型可以省略。例如,(int a)
可以简化成a
。 - 有多个参数时,必须加括号,但可以同时省略参数类型。例如,
(int a, int b, int c)
可以简化成(a, b, c)
。
优点
以下是使用 Lambda
表达式的几个主要原因:
- 代码简洁性。用更少的代码实现相同的功能。
- 避免内部类定义过多。
- 减少了不必要的样板代码,只留下核心的逻辑。
例如,可以用一行代码定义一个方法,而不是写一个完整的内部类。
传统的内部类方式:
Runnable task = new Runnable() {@Overridepublic void run() {System.out.println("Hello, Lambda!");}
};
使用 Lambda
表达式:
Runnable task = () -> System.out.println("Hello, Lambda!");
2. 推导过程
接下来,我们通过对内部类的简化,进行 Lambda
表达式的推导。
定义函数式接口
定义一个函数式接口 ILike
,它只有一个抽象方法 lambda()
。
// 1. 定义一个函数式接口
interface ILike {// 函数式编程,有且仅有一个抽象方法public abstract void lambda();
}
外部类实现接口
定义一个 Like
类去实现 ILike
接口。
// 2. 实现类(外部):定义一个类去实现接口
class Like implements ILike {// 实现接口的抽象方法@Overridepublic void lambda() {System.out.println("Test Lambda Like...");}
}// 主方法中
ILike like = new Like();
like.lambda();
静态内部类实现
简化:定义一个静态内部类 Like2
去实现 ILike
接口。
// 3. 静态内部类
static class Like2 implements ILike {// 实现接口的抽象方法@Overridepublic void lambda() {System.out.println("Test Lambda Like2...");}
}// 主方法中
like = new Like2();
like.lambda();
局部内部类实现
简化:定义一个局部内部类 Like3
去实现 ILike
接口。
// 4. 局部(成员)内部类
class Like3 implements ILike {// 实现接口的抽象方法@Overridepublic void lambda() {System.out.println("Test Lambda Like3...");}
}// 主方法中
like = new Like3();
like.lambda();
匿名内部类实现
简化:定义一个匿名内部类去实现 ILike
接口。
// 5. 匿名内部类,没有名称的类,必须借助接口或者父类
like = new ILike() {@Overridepublic void lambda() {System.out.println("Test Lambda Like4...");}
};like.lambda();
用 Lambda 表达式简化
用 Lambda
表达式进行简化。一个简化的过程,只保留最核心的代码。
// 6. 用 Lambda 表达式进行简化
// 一个简化的过程,只保留最核心的代码like = ()-> {System.out.println("Test Lambda Like5...");
};like.lambda();
3. 类比 Runnable 接口
Runnable
接口定义:
public interface Runnable {public abstract void run();
}
在 Java 中,函数式接口是指一个接口中只定义了一个抽象方法的接口。
Runnable
接口中只包含一个抽象方法 run()
,符合这个定义。因而 Runnable
接口是一个函数式接口,可以被 Lambda
表达式所使用。
使用 Lambda
表达式创建 Runnable
对象:
// Runnable task = () -> System.out.println("Hello, Runnable!");public class RunnableExample {public static void main(String[] args) {// 使用 Lambda 表达式创建 Runnable 对象Runnable task = () -> System.out.println("Hello, Runnable!");// 创建 Thread 对象,并传入 Runnable 对象Thread thread = new Thread(task);// 启动线程thread.start();}
}
四、参考资料
狂神说 Java 多线程:https://www.bilibili.com/video/BV1V4411p7EF
TIOBE 编程语言走势: https://www.tiobe.com/tiobe-index/
Typora 官网:https://www.typoraio.cn/
Oracle 官网:https://www.oracle.com/
Notepad++ 下载地址:https://notepad-plus.en.softonic.com/
IDEA 官网:https://www.jetbrains.com.cn/idea/
Java 开发手册:https://developer.aliyun.com/ebook/394
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/
MVN 仓库:https://mvnrepository.com/
相关文章:

多线程 03:知识补充,静态代理与 Lambda 表达式的相关介绍,及其在多线程方面的应用
一、概述 记录时间 [2024-08-16] 前置知识:Java 基础篇;Java 面向对象 多线程 01:Java 多线程学习导航,线程简介,线程相关概念的整理 多线程 02:线程实现,创建线程的三种方式,通过多…...

机器学习中的距离概念
距离在机器学习中应用广泛,包括欧式距离、曼哈顿距离、内积距离和KL距离。 下面总结一下。 机器学习中的距离 欧式距离曼哈顿距离内积距离KL距离距离作为损失函数(MSE/MAE...)欧式距离与内积距离的联系☆距离的有效性 欧式距离 欧式距离(Euclidean Dis…...

Java 如何判断map为null或者空
1.示例一 在Java中,如果我们想判断一个Map是否为null或者空(即没有任何键值对),我们可以使用以下的方法。下面是一个完整的示例代码,展示了如何进行这样的判断: import java.util.HashMap; import java…...

终端用户视角下的性能测试,体验与度量的融合
传统的性能测试的度量标准是什么 响应时间(Response Time): 这是从客户端发出请求到接收到完整响应所需的时间。响应时间是衡量系统性能的重要指标,特别是在面向用户的应用中,因为它直接影响用户体验。 而用户体验的度…...

KCP源码解析系列(二)KCP协议结构体
一、KCP协议包 1.1 kcp协议包 kcp中只有一种数据包,不管是数据还是控制信息,都用这个数据包来表示 0 4 5 6 8 (BYTE) ---------------------------- | conv |cmd|frg| wnd | ---------------------------- 8 | …...

微软运行库全集合:一站式解决兼容性问题
开发者在部署应用程序时经常遇到因缺少运行库而引发的兼容性问题。为了解决这一问题,电脑天空推荐微软常用运行库合集,一个集成了微软多个关键运行库组件的软件包。 📚 包含组件概览: Visual Basic Virtual Machine:…...

【 亿邦动力网-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …...

算法笔记|Day26贪心算法IV
算法笔记|Day26贪心算法IV ☆☆☆☆☆leetcode 452. 用最少数量的箭引爆气球题目分析代码 ☆☆☆☆☆leetcode 435. 无重叠区间题目分析代码 ☆☆☆☆☆leetcode 763.划分字母区间题目分析代码 ☆☆☆☆☆leetcode 452. 用最少数量的箭引爆气球 题目链接:leetcode …...

CVPR2023《DNF: Decouple and Feedback Network for Seeing in the Dark》暗光图像增强论文阅读笔记
相关链接 论文链接 https://openaccess.thecvf.com/content/CVPR2023/papers/Jin_DNF_Decouple_and_Feedback_Network_for_Seeing_in_the_Dark_CVPR_2023_paper.pdf 代码链接 https://github.com/Srameo/DNF 摘要 RAW数据的独特属性在低光照图像增强方面展现出巨大潜力。…...

大厂进阶七:React状态管理全解析
前言: React 中用于状态管理的hook及库有:useState、useReducer、useContext、useReducer useContext和一些第三方的库如redux、mobx等。 1、useState 单一组件某个具体状态 2、useReducer 单一组件中多个状态管理,策略分发机制统一管理…...

【ocr识别003】flask+paddleocr+bootstrap搭建OCR文本推理WEB服务
1.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 2.了解、学习OCR相关技术知识领域,结合日常的场景进行测试、总结。如本文总结的flaskpaddleocrbootstrap搭建OCR文本推理WEB服务应用示例场景。 文章目录 1.代码结构2.效果演…...

从零开始搭建 LVS 高性能集群 (DR模式)
从零开始搭建 LVS 高性能集群 (DR模式) 架构 本设计方案采用三台服务器构建集群,使用Linux Virtual Server (LVS) 作为负载均衡器,运行在直接路由 (DR) 模式下。集群中的每一台服务器都将运行相同的服务,以实现 高可用…...

Linux环境开发工具【yum与vim】
🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1.Linux软件包管理器yum1.1 快速使用yum 2. Linux编辑器-vim的使用2.1 vim的基本…...

laravel GuzzleHttp Client 无法获取返回的错误信息
Client发送一些请求,当返回状态不是200的时候,无法获取完整错误信息 $client new Client([base_uri > $this->getUri()./order/aaaaaa,timeout > 30,verify > false]);try {$response $client->request(POST, , [headers > [Lang&g…...

XMOS 多路音频解码器
当谈及高性能音频解码器,XMOS 是一个不容忽视的名字。作为音频解决方案领域的领军者,XMOS 的多路音频解码器在音频处理技术中扮演着至关重要的角色。下面我们一起深入探讨 XMOS 多路音频解码器去了解这一技术的魅力。 设计背景:追求音频极致…...

XSS小游戏(题目+解析)
xss题目练习地址: xss小游戏 游戏界面 一、Ma Spaghet! 我将题目要求进行翻译: 题目的主要要求就是:弹出一个(1337)的弹窗 开始解题: Let’s Go! 首先,传个参数看看 发现参数直接显示在了 < h2 >…...

《Redis核心技术与实战》学习笔记4——AOF日志:宕机了,Redis如何避免数据丢失?
文章目录 AOF 日志是如何实现的?三种写回策略 日志文件太大了怎么办?AOF 重写会阻塞吗?小结 大家好,我是大白。 如果有人问你:“你会把 Redis 用在什么业务场景下?”我想你大概率会说:“我会把它当作缓存使…...

NextJs - 服务端/客户端组件之架构多样性设计
NextJs - 服务端/客户端组件之架构多样性设计 前言一. 架构设计1.1 SSR流式渲染常见错误设计之 - 根页面同步阻塞1.2 架构设计之 - 客户端组件依赖于服务端组件数据① 使用 Redux 完成数据共享 1.3 架构设计之 - 单页内的分步骤跳转① 如何做到服务端组件和客户端组件之间的切换…...
使用 Python 进行 PDF 文件加密
使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数,该函数接受三个参数:输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…...

Spring Boot集成RabbitMQ
目录 1.RabbitMQ简介2.添加依赖3.配置RabbitMQ连接4.DirectExchange4.1 消费者4.2 生产者4.3 测试4.4 一个交换机对多个队列4.5 一个队列对多个消费者 5.FanoutExchange5.1 消费者5.2 生产者5.3 测试 6.TopicExchange6.1 消费者6.2 生产者 1.RabbitMQ简介 RabbitMQ是一个由Erl…...

OLED屏幕制造工艺流程
OLED屏幕制造工艺流程是一个复杂且精细的过程,涉及多个关键步骤以确保最终的显示效果和性能。以下是OLED屏幕制造工艺流程的主要步骤: 1. 衬底制作与准备 材料选择:OLED器件需要一个透明的导电衬底,通常使用玻璃或塑料材料。 清…...

knowLedge-VueCLI项目中环境变量的定义与使用
1. env 1.1简介 在 Vue CLI 创建的项目中,你可以通过 .env 文件来定义环境变量。Vue CLI 支持多种 .env 文件,它们根据文件名中的前缀来决定何时加载和使用这些环境变量。 以下是一些常见的 .env 文件及其用途: .env:在任何环境…...

【C#】 接口 继承
简介 继承是面向对象编程的核心特性之一,它允许我们创建一个类(称为子类)来继承另一个类(称为基类)的属性和方法。 作用 这样,我们可以重用代码,减少重复,并使我们的代码更加模块…...

Self-Supervised Learning(李宏毅老师系列)
自学参考: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding BERT 论文逐段精读 视频课 课件资料 笔记 一、概述 自监督学习模型与芝麻街~ 参数量 ELMO:94MBERT:340MGPT-2:1542MMegatron&…...

8月16日笔记
只有DNS协议出网场景 DNS 协议是一种请求、应答协议,也是一种可用于应用层的隧道技术。DNS 隧道的工作原理很简单,在进行 DNS 查询时,如果查询的域名不在 DNS 服务器本机缓存中,就会访问互联网进行查询,然后返回结果。…...

苹果Mac电脑——装macOS和Windows双系统的方法
一、实验环境 在Windows系统电脑上制作MacOS启动U盘。准备一个大于16G的U盘。 二、实验步骤 2.1 在Windows系统电脑上制作MacOS启动U盘 MacOS镜像下载 在Windows系统电脑上制作MacOS启动U盘的方法 2.2 U盘插上苹果电脑,安装macOS系统 U盘插上苹果电脑…...

【C++ 面试 - 基础题】每日 3 题(十五)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...

数学建模学习笔记
数学建模学习笔记 现学现卖,随缘更新QwQ 主要根据b站大师兄的视频整理而成,有不懂的可以去看原视频 List 数学建模学习笔记一、 层次分析法1.1 矩阵的一致性及其检验1.2 权重计算1.3 具体流程 二、模糊综合评测2.1 隶属函数2.2 隶属函数的确定方法2.3 模…...

个人可识别信息(PII) AI 去除 API 数据接口
个人可识别信息(PII) AI 去除 API 数据接口 ai / 隐私保护 基于 AI 模型自动去除个人识别信息(PII) 个人信息保护 / AI 模型 。 1. 产品功能 基于自有专业模型进行 PII 自动去除高效处理敏感信息全接口支持 HTTPS(TLS v1.0 / v1.1 / v1.2 /…...

【Python-办公自动化】1秒提取PPT文本内容形成目录保存至WORD
欢迎来到"花花 Show Python",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。 自我介绍: 我热衷于将复杂的技术概念以简单易懂…...