【Java基础】java中的lambda表达式
Java Lambda表达式深度解析:语法、简化规则与实战
前言
Java 8的Lambda表达式通过简化匿名内部类和引入函数式编程,极大提升了代码的简洁性和可读性。
一、Lambda表达式的核心语法
Lambda表达式由参数列表、->
符号和表达式主体组成,其基本结构为:
(参数列表) -> 表达式主体
1.1 基础语法示例
场景 | Lambda表达式 | 解释 |
---|---|---|
无参数 | () -> System.out.println("Hi") | 无参数,执行代码块 |
单参数 | x -> x * 2 | 参数类型推断,返回计算结果 |
多参数 | (x, y) -> x + y | 参数类型推断,返回和值 |
多行语句 | (x) -> { return x * x; } | 使用大括号包裹,显式return |
显式类型声明 | (int x, int y) -> x + y | 显式声明参数类型 |
1.2 内置函数式接口家族
Java 8在java.util.function
包中提供了丰富的函数式接口,涵盖数据处理、条件判断、数据生成等场景:
接口名称 | 方法定义 | 典型用途 |
---|---|---|
Consumer<T> | void accept(T t) | 消费数据(如打印、存储) |
Supplier<T> | T get() | 提供数据(如生成随机数) |
Function<T, R> | R apply(T t) | 转换数据(如字符串转大写) |
Predicate<T> | boolean test(T t) | 判定条件(如判断是否为偶数) |
BiFunction<T,U,R> | R apply(T t, U u) | 双参数转换(如计算两个数的和) |
二、Lambda表达式简化规则(核心规则)
Lambda表达式的简化规则基于类型推断和语法糖,共有以下5条明确规则:
2.1 规则1:参数类型推断
规则:若参数类型可由上下文推断,可省略类型声明。
- 示例:
// 无推断(冗余) Consumer<String> c1 = (String s) -> System.out.println(s);// 省略类型(推断为String) Consumer<String> c2 = s -> System.out.println(s);
2.2 规则2:单参数省略括号
规则:若参数列表仅有一个参数,可省略参数外的括号。
- 示例:
// 带括号(冗余) Function<Integer, Integer> f1 = (x) -> x * 2;// 省略括号(简洁) Function<Integer, Integer> f2 = x -> x * 2;
2.3 规则3:无参数省略括号
规则:若参数列表为空,可保留空括号,但不能省略。
- 示例:
Runnable r1 = () -> System.out.println("Hello"); // 正确 Runnable r2 = -> System.out.println("Hello"); // 编译错误!必须保留()
2.4 规则4:单表达式省略大括号和return
规则:若表达式主体是单条表达式(非代码块),可省略{}
和return
。
- 示例:
// 带大括号和return Function<Integer, Integer> f1 = x -> { return x * 2; };// 省略大括号和return Function<Integer, Integer> f2 = x -> x * 2;
2.5 规则5:多行语句强制保留{}
和return
规则:若表达式主体是多条语句,必须使用{}
包裹,并显式return
。
- 示例:
Function<Integer, Integer> f = x -> {int result = x * 2;if (result > 10) return 0;return result; };
三、简化规则的例外与陷阱
3.1 陷阱1:参数类型冲突
若参数类型无法推断,需显式声明:
// 错误:类型无法推断
Comparator comp = (o1, o2) -> o1.compareTo(o2); // 编译错误!
// 正确:显式类型
Comparator<Integer> comp = (Integer o1, Integer o2) -> o1.compareTo(o2);
3.2 陷阱2:返回值类型不匹配
Lambda的返回值类型必须与函数式接口方法一致:
// 错误:返回类型不匹配
Supplier<Integer> s = () -> "Hello"; // 编译错误!期望返回Integer
3.3 陷阱3:单参数省略括号的误区
单参数省略括号时,类型必须可推断:
// 错误:类型无法推断
Function f = x -> x * 2; // 编译错误!参数类型未知
// 正确:显式接口或上下文推断
Function<Integer, Integer> f = x -> x * 2;
四、Lambda表达式实战场景
4.1 数据过滤与转换
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filtered = names.stream().filter(s -> s.length() > 4) // Predicate<T>.map(String::toUpperCase) // Function<T, R>.collect(Collectors.toList());
4.2 并行计算
int sum = IntStream.range(1, 1000).parallel() // 启用并行流.map(n -> n * 2) // 映射操作.sum(); // 终端操作
4.3 线程与异步任务
new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Thread: " + i);}
}).start();
五、简化规则的完整示例
5.1 从复杂到简洁的演变
// 原始匿名内部类
Comparator<String> comp1 = new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}
};// Lambda的完整写法
Comparator<String> comp2 = (String s1, String s2) -> {return s1.length() - s2.length();
};// 简化后(参数类型推断+单表达式省略return)
Comparator<String> comp3 = (s1, s2) -> s1.length() - s2.length();
六、总结:Lambda表达式简化规则速查表
规则 | 适用场景 | 简化写法 |
---|---|---|
参数类型推断 | 参数类型可推断 | (s) -> ... → s -> ... |
单参数省略括号 | 参数列表仅一个参数 | (x) -> ... → x -> ... |
无参数保留空括号 | 无参数 | () -> ... |
单表达式省略大括号 | 表达式主体是单条表达式 | { return expr; } → expr |
多行语句保留{} 和return | 表达式主体是多条语句或复杂逻辑 | 必须显式{} 和return |
七、Lambda表达式的局限性
1. 非函数式接口不支持
若接口包含多个抽象方法,Lambda无法绑定:
interface NonFunctional {void method1();void method2(); // 编译错误!
}
2. 异常处理限制
Lambda抛出的**受检异常(Checked Exception)**必须与接口方法的声明一致:
// 接口方法声明抛出IOException
interface FileProcessor {void process() throws IOException;
}// Lambda必须抛出IOException
FileProcessor fp = () -> { throw new IOException(); }; // 正确
3. 无法访问局部变量的修改
Lambda无法修改外部变量,除非使用Atomic
类型或包装类:
AtomicInteger count = new AtomicInteger(0);
list.forEach(item -> count.incrementAndGet()); // 正确
八、源码级原理分析
1. invokedynamic
指令的字节码示例
// Lambda表达式:() -> System.out.println("Hello")
javap -v LambdaDemo.class
// 输出片段:
// invoke动态指令:
invokedynamic #0:LambdaMetafactory.bootstrapMethod
// 引用LambdaMetafactory的metafactory方法
2. 适配器类的生成
通过javap
反编译生成的适配器类:
// 生成的适配器类(如Lambda$1)
public final class Lambda$1 implements Consumer {private Lambda$1() {}public void accept(java.lang.Object var1) {java.lang.System.out.println("Hello");}
}
3. 方法句柄的绑定
LambdaMetafactory
通过MethodHandle
将Lambda逻辑绑定到接口方法:
// 伪代码示例:
MethodType interfaceType = MethodType.methodType(void.class, Object.class);
MethodHandle implMethod = MethodHandles.lookup().findVirtual(System.class, "out", MethodType.methodType(PrintStream.class)
);
CallSite site = LambdaMetafactory.metafactory(lookup, "accept", // 接口方法名interfaceType, // 接口方法类型implMethod // 实现方法
);
附:完整代码示例
import java.util.*;
import java.util.function.*;public class LambdaSimplification {public static void main(String[] args) {// 规则1:参数类型推断Consumer<String> c1 = s -> System.out.println(s); // 省略类型c1.accept("Hello Lambda!");// 规则2:单参数省略括号Function<Integer, Integer> f1 = x -> x * 2; // 省略()System.out.println(f1.apply(3)); // 输出6// 规则3:无参数保留()Runnable r1 = () -> System.out.println("Run"); // 必须保留()r1.run();// 规则4:单表达式省略{}和returnFunction<Integer, Integer> f2 = x -> x * x; // 省略{}和returnSystem.out.println(f2.apply(5)); // 输出25// 规则5:多行语句保留{}和returnFunction<Integer, Integer> f3 = x -> {int temp = x + 5;return temp * 2;};System.out.println(f3.apply(3)); // 输出16}
}
九、高级技巧
4.1 方法引用:Lambda的终极简化
当Lambda表达式直接调用已有方法时,可用方法引用(Method Reference)替代:
// 传统Lambda
list.forEach(s -> System.out.println(s));// 方法引用(等价写法)
list.forEach(System.out::println);
4.2 有效final变量的使用技巧
若需在Lambda中修改外部变量,可将其包装为不可变对象:
AtomicInteger count = new AtomicInteger(0);
list.forEach(n -> count.getAndIncrement());
相关文章:
【Java基础】java中的lambda表达式
Java Lambda表达式深度解析:语法、简化规则与实战 前言 Java 8的Lambda表达式通过简化匿名内部类和引入函数式编程,极大提升了代码的简洁性和可读性。 一、Lambda表达式的核心语法 Lambda表达式由参数列表、->符号和表达式主体组成,其基…...
【RS】OneRec快手-生成式推荐模型
note 本文提出了一种名为 OneRec 的统一生成式推荐框架,旨在替代传统的多阶段排序策略,通过一个端到端的生成模型直接生成推荐结果。OneRec 的主要贡献包括: 编码器-解码器结构:采用稀疏混合专家(MoE)架构…...
DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码)
视频讲解: DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码) 代码仓库:GitHub - LitchiCheng/DRL-learning: 深度强化学习 2048游戏介绍,引用维基百科 《2048》在44的网格上进行。…...
练习题:87
目录 Python题目 题目 题目分析 代码实现 代码解释 列表推导式部分: 变量赋值和输出: 运行思路 结束语 Python题目 题目 使用列表推导式生成一个包含 1 到 100 中所有偶数的列表。 题目分析 本题要求使用 Python 的列表推导式生成一个包含 …...
二叉树的层序遍历(102)
102. 二叉树的层序遍历 - 力扣(LeetCode) 解法: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
NVMe集群:加速数据处理
随着大数据和云计算的快速发展,企业面临着前所未有的数据处理挑战。传统的存储技术和架构已经难以满足现代应用对高性能和低延迟的需求。在这种背景下,NVMe(Non-Volatile Memory Express)集群应运而生,它以其卓越的性能…...
JUC并发编程:共享模型之管程
一、共享带来的问题 (1)Java的体现 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗? (2)问题分析 以上的结果可能是正数、负数、零。为什么呢…...
Java构造方法详解:从入门到实战
目录 一、什么是构造方法? 二、构造方法的作用 三、构造方法分类与使用 1. 默认构造方法 2. 有参构造方法 3. 构造方法重载 四、注意事项(避坑指南) 五、经典面试题解析 六、实战应用场景 七、总结 一、什么是构造方法? …...
Uniapp 字体加载问题(文件本地存储)
项目场景: 在最近公司开发一款小程序,但是小程序的文字需要用艺术字,就是那种不能用切图绕开的那种! 问题描述 我们在使用uni.loadfontface Api请求数据字体文件的时候总是会报错,就是那种网上也找不到解决方法的那种…...
HTML 新手入门:从零基础到搭建第一个静态页面(一)
开启 HTML 学习之旅 在互联网的广袤世界中,网页是我们与信息交互的主要窗口。而 HTML,作为构建网页的基石,就像是搭建房屋的砖块,是网页开发中不可或缺的基础。无论你是对网页开发充满好奇的小白,还是渴望系统学习前端…...
使用multiprocessing实现进程间共享内存
在 Python 中,可以使用多种方法来实现几个进程之间的通信。 简单消息传递:使用 multiprocessing.Queue 或 multiprocessing.Pipe。 共享简单数据:使用 multiprocessing.Value 或 multiprocessing.Array。 共享复杂数据:使用 multiprocessing.Manager。 进程间信号控制:使用…...
在IDEA中连接达梦数据库:详细配置指南
达梦数据库(DM Database)作为国产关系型数据库的代表,广泛应用于企业级系统开发。本文将详细介绍如何在IntelliJ IDEA中配置并连接达梦数据库,助力开发者高效完成数据库开发工作。 准备工作 1. 下载达梦JDBC驱动 访问达梦官方资…...
docker无法正常拉取镜像问题的解决
目录 1.前言 2.解决方案 1.前言 安装docker后拉取镜像,遇见了如下问题: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded whil…...
如何在保持安全/合规的同时更快地构建应用程序:DevOps 指南
随着敏捷思维方式的兴起,开发和 DevOps 团队都面临着持续的压力,他们需要以迭代方式缩短发布周期并加快部署速度,以满足不断增长的客户期望。随着这种对速度的追求越来越强烈,维护安全性和合规性标准的复杂性也随之增加。 当今 D…...
SQL Server查询优化
最常用,最有效的数据库优化方式 查询语句层面 避免全表扫描 使用索引:确保查询条件中的字段有索引。例如,查询语句 SELECT * FROM users WHERE age > 20,若 age 字段有索引,数据库会利用索引快速定位符合条件的记…...
iOS底层原理系列04-并发编程
在移动应用开发中,流畅的用户体验至关重要,而并发编程是实现这一目标的关键技术。本文将深入探讨iOS平台上的并发编程和多线程架构,帮助你构建高性能、响应迅速的应用程序。 1. iOS线程调度机制 1.1 线程本质和iOS线程调度机制 线程是操作…...
企业数字化转型数据治理解决方案(119页PPT)(文末有下载方式)
资料解读:企业数字化转型数据治理解决方案 详细资料请看本解读文章的最后内容。 在当今数字化时代,数据已经成为企业最宝贵的资产之一。然而,随着数据量的激增和数据来源的多样化,如何有效管理和利用这些数据成为了企业面临的一…...
git报错:“fatal:refusing to merge unrelated histories“
新建仓库,克隆本地项目到新仓库,首次同步本地已提交的代码到远程时,报错:"fatal:refusing to merge unrelated histories" 。 报错意思是:致命的:拒绝合并无关的历史。 一、问题背景ÿ…...
Jmeter下载及环境配置
Jmeter下载及环境配置 java环境变量配置配置jdk环境变量检查是否配置成功JMeter下载 java环境变量配置 访问地址: https://www.oracle.com/cn/java/technologies/downloads/ 注意:需要自己注册账号 下载完成,解压后的目录为: …...
K8S学习之基础二十四:k8s的持久化存储之pv和pvc
K8S的存储之pv和pvc 在 Kubernetes (k8s) 中,持久化存储是通过 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来实现的。PVC 是用户对存储资源的请求,而 PV 是集群中的实际存储资源。PVC 和 PV 的关系类似于 Pod 和 Node 的关系。 Persisten…...
1.5、Java构造方法重载
构造方法重载的实现 (1)定义多个构造方法 class Person {private String name;private int age;// 无参构造方法public Person() {this.name "Unknown";this.age 0;}// 带一个参数的构造方法public Person(String name) {this.name name;…...
领域驱动设计(DDD)技术分享:从三层架构到DDD的进化之旅
一、开篇话:我们为什么要聊DDD? 如果你像我一样有着Java开发背景,那Spring的三层架构可能是你的老朋友了。Controller-Service-DAO这种模式简直就像我们编程的"家常便饭"。但是,随着业务越来越复杂,你是否也…...
LeetCode - #227 基于 Swift 实现基本计算器
摘要 在这篇文章中,我们将实现一个基于 Swift 语言的基本计算器。该计算器能够解析和计算包含 、-、* 和 / 的数学表达式,并且遵循运算符的优先级规则。整数除法仅保留整数部分,不能使用 eval() 这样的内置解析方法。 描述 给你一个字符串表…...
Elasticsearch Java High Level Client [7.17] 使用
es 的 HighLevelClient存在es源代码的引用,结合springboot使用时,会存在es版本的冲突,这里记录下解决冲突和使用方式(es已经不建议使用这个了)。 注意es服务端的版本需要与client的版本对齐,否则返回数据可…...
[多线程]基于环形队列(RingQueue)的生产者-消费者模型的实现
标题:[多线程]基于环形队列(RingQueue)的生产者-消费者模型 水墨不写bug 一、模型实现 接下来我们要实现一个基于环形队列(RingQueue)的生产者-消费者模型。该模型使用信号量和互斥锁来保证生产者和消费者之间的同步与…...
HAL库STM32常用外设—— CAN通信(一)
文章目录 一、CAN是什么?1.1 CAN应用场景1.2 CAN通信优势 二、CAN基础知识介绍2.1 CAN总线结构2.2 CAN总线特点2.2.1 CAN总线的数据传输特点2.2.2 位时序和波特率 2.3 CAN位时序和波特率2.3 CAN物理层2.3.1 CAN 物理层特性2.3.2 CAN 收发器芯片介绍 2.4 CAN协议层2.…...
分页查询的实现
目录 前言 一.问题描述 二.后端实现步骤 2.1配置PageHelper插件 ①导入依赖 ②在application.yml配置文件中添加相关配置 2.2编写一个入门的程序,体验分页过程 2.3定义一个vo,用来收集分页后的所有信息 2.4修改serviceImpl层的代码 2.5动态设…...
Sourcetree——使用.gitignore忽略文件或者文件夹
一、为何需要文件忽略机制? 1.1 为什么要会略? 对于开发者而言,明智地选择忽略某些文件类型,能带来三大核心优势: 仓库纯净性:避免二进制文件、编译产物等污染代码库 安全防护:防止敏感信息&…...
Thinkphp的belongsToMany(多对多) 和 hasManyThrough(远程一对多)的区别是什么?
虽然 belongsToMany(多对多) 和 hasManyThrough(远程一对多) 都会使用 JOIN 查询,但它们的核心区别在于 关联关系的本质不同,具体如下: 1️⃣ belongsToMany(多对多) &a…...
DataWhale 大语言模型 - 大模型技术基础
本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开,覆盖大语言模型训练与使用的全流程,从预训练到微调与对齐,从使用技术到评测应用,帮助学员全面掌握大语言模型的核心技术。并且,课程…...
Docker+Flask 实战:打造高并发微服务架构
DockerFlask 实战:打造高并发微服务架构 今天我们要深入探讨一个非常热门且实用的主题:基于 Docker 部署 Python Flask 应用。Docker 作为当下最流行的容器化技术,已经广泛应用于各种开发和部署场景,尤其是在微服务架构中。而 Fl…...
前端跨域如何调试,以及相关概念梳理【环境变量 本地代理 正向代理 反向代理 OPTIONS请求 CDN 等】
跨域报错 一 前端日常开发时,项目的部署地址和接口请求的地址一般是同源的,不会跨域。 例如项目的测试环境部署在https://my-dev.BeatingWorldLine.com/xxx, 测试环境的访问接口域名也要相同来保证不跨域https://my-dev.BeatingWorldLine.com/api/xxx, …...
【区块链】以太坊
学习视频源链接: https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根据肖老师的视频进行的笔记记录 bitcoin 1.0 区块链 以太坊 2.0区块链 以太坊 设置了 memory hard mining puzzle ,这造成了asic resistance, 后续 proof of work &a…...
MCU的工作原理:嵌入式系统的控制核心
MCU的工作原理可以概括为以下几个步骤: 1. 初始化 上电后,MCU从Flash存储器中加载程序代码,并初始化外设和寄存器。 2. 任务执行 根据程序逻辑,MCU执行数据处理、外设控制和通信等任务。通过中断系统实时响应外部事件。 3. 低…...
离线服务器ollama新增qwen2:0.5b模型
离线服务器ollama新增qwen2:0.5b模型 Dify集成ollama前面已经介绍过离线服务器CentOS使用的docker安装的ollama,其中在ollama中已经安装了deepseek-r1:1.5b。目前的需求是需要再安装一个qwen2:0.5b的模型,那么如何安装呢? 1.首先在有网的服…...
Ubuntu20.04安装运行DynaSLAM
目录 一、安装Anaconda 二、相关依赖库安装 1、boost安装 2、Eigen 3安装 3、opencv安装 4、Pangolin安装 三、配置Mask_RCNN环境 四、DynaSLAM编译 五、DynaSLAM运行 一、安装Anaconda 打开以下链接: Index of / 下载和自己系统匹配的安装包。这里下…...
Apache Shiro反序列化漏洞深度剖析:从原理到利用
引言 在Web安全的世界里,反序列化漏洞一直是最危险的漏洞类型之一。今天,我们将深入探讨Apache Shiro框架中的两个著名反序列化漏洞.通过通俗易懂的解释和详细的实例,帮助你理解这类漏洞的本质和危害。 Shiro框架与"记住我"功能简…...
Android UI 组件系列(二):Button 进阶用法
引言 在上一篇博客中,我们介绍了 Button 的基本用法和常见属性,掌握了 Button 的基础知识。然而,在实际开发中,Button 远不止于简单的点击功能,它还可以支持不同的变体、丰富的自定义样式,以及更灵活的状态…...
CentOS-7安装Docker(更新时间:2025-03-12)
CentOS-7安装Docker 该文章记录在CentOS 7上安装Docker的过程和步骤,以及在安装过程中遇到的困难和解决方案。 目录 CentOS-7安装Docker一、环境准备二、安装Docker1.验证服务器是否接入互联网2. 检查CentOS内核版本3.使用root权限登录CentOS。确保yum包更新到最新…...
网络空间安全(31)安全巡检
一、定义与目的 定义: 安全巡检是指由专业人员或特定部门负责,对各类设施、设备、环境等进行全面或重点检查,及时发现潜在的安全隐患或问题。 目的: 预防事故发生:通过定期的安全巡检,及时发现并解决潜在的…...
Kubernetes学习笔记-移除Nacos迁移至K8s
项目服务的配置管理和服务注册发现由原先的Nacos全面迁移到Kubernetes上。 一、移除Nacos 移除Nacos组件依赖。 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <…...
Docker 构建 nginx-redis-alpine 项目详解
Docker 构建 nginx-redis-alpine 项目详解 一、课程概述 嘿,朋友们!今天咱们要深入探索一个超级实用的项目 ——nginx-redis-alpine!这个项目可不简单,它包含了好多重要的知识点,像文件目录结构、核心文件的作用及配…...
【教学类-43-26】20240312 数独4宫格的所有可能(图片版 576套样式,空1格-空8格,每套65534张*576小图=3千万张小图)
背景需求: 之前做了三宫格所有可能图片 510小图*12套6120图,所以3分钟就生成了 【教学类-43-25】20240311 数独3宫格的所有可能(图片版 12套样式,空1格-空8格,每套510张,共6120小图)-CSDN博客…...
ChromeOS 134 版本更新
ChromeOS 134 版本更新 一、ChromeOS 134 更新内容 1. ChromeOS 自助终端(Kiosk)模式支持隔离 Web 应用(Isolated Web Apps) 从 ChromeOS 134 开始,自助终端(Kiosk)模式支持 隔离 Web 应用&a…...
Redis面试篇
目录 Redis面试篇 1.什么是Redis?作用是什么? 2.什么是缓存穿透、缓存击穿、缓存雪崩 2.1缓存穿透 2.2缓存击穿 2.3缓存雪崩 3.redis如何持久化 1. RDB(快照存储) 2. AOF(追加日志) 4.Redis 的过…...
C#中通过Response.Headers设置自定义参数
一、基础设置方法 1. 直接添加自定义头 // ASP.NET Core方案 Response.Headers.Append("X-API-Version", "2.3.1"); Response.Headers.Append("Custom-Auth-Token", Guid.NewGuid().ToString());• 底层原理:通过IHeaderDictionary…...
C++标准模板库学习--函数模板返回值参数类型
template<typename T1, typename T2> 2 T1 max (T1 a, T2 b) 3 { 4 return b < a ? a : b; 5 } 6 ... 7 auto m ::max(4, 7.2); // OK, 不过返回类型与第一个参数类型一样 如何解决模板的返回类型 法一,使用decltype进行类型推断,在编译时…...
BUG修复 | 一次钉钉工作台应用远程调试实战(开发者工具)
#1 ℹ️背景故事 最近用户反馈,钉钉工作台的应用无法正常使用,卡在自动登录页面。 天,这是运行10年的老程序😱,我当时真是吓得不轻。这老古董完全不记得怎么改了😂。 #2 🐞开启远程调试 钉钉…...
[目标检测] 训练之前要做什么
背景:训练一个Yolo8模型,在训练之前,数据集的处理是影响效果的关键因素。 Step1 定义规则 什么是人/车,比如人的话可能是站着的人,如果是骑电动车/自行车就不算是人。 Step2 收集数据集 1. 自己标注。如果是自己标…...
一窥DeepSeek开源EPLB项目:揭开技术背后的面纱
摘要 在DeepSeek开源DualPipe项目的同一天,EPLB项目也正式对外公开。EPLB(Enhanced Pipeline Balancing)并非一蹴而就的奇迹,而是经过长时间的研发与优化。该项目旨在通过改进管道平衡机制,提升系统的稳定性和效率。本…...