MapUtils 工具类详解:安全取值、默认值与判空的工程实践
1. 先聊聊我为什么把 MapUtils 放进“必学清单”1.1 一个每天都在发生的取值场景上一篇文章我们还在跟 Map 接口本身的特性较劲这篇直接切到业务视角聊 Apache 开源生态里那个几乎人人都听过、但很多人只会用它做 get/put 的 MapUtils 工具类。作为 Map 系列的二我准备把这几年实际项目里怎么用它、为什么用它、以及踩过的坑一次性说透。先看一个很普通的取值代码。假设接口返回一个 Map你要取 name 字段MapString, Object result someService.getResult(); String name ; if (result ! null result.get(name) ! null) { name result.get(name).toString(); }这段代码没什么问题但写多了真的很烦。一个字段一个 if十个字段就是十段同样的判空逻辑而且很容易漏掉某一层。后来我换成 MapUtils 之后同样的逻辑变成一行String name MapUtils.getString(result, name);key 不存在返回 nullMap 本身为 null 也不抛异常。这一行就把上面三行干掉了。对于动不动几十个字段的装配逻辑省下来的代码量非常可观。1.2 MapUtils 到底是什么来头MapUtils 并不是 JDK 自带的类它来自开源社区非常有名的 Commons Collections 库。这个库从 2001 年左右就开始演进里面塞满了各种集合操作的工具类MapUtils 只是其中一个专门围绕 Map 做了大量便捷封装安全取值、带默认值取值、键值翻转、空判断、固定大小 Map、谓词校验等等。我见过不少人已经在项目 pom 里引了 Commons Collections但只是顺手用了它的 CollectionUtils.isEmpty对 MapUtils 几乎是零了解。这有点可惜因为 MapUtils 解决的是 Java 业务开发里最高频的一类痛点Map 的读取不够安全、类型转换不够顺手。1.3 学它之前需要什么基础这系列既然叫“Map 入门一篇看懂”我并不假设你已经掌握多深的集合源码。只要满足下面几个条件就可以读熟悉 Map 的常用方法比如 get、put、keySet、entrySet知道 null 和空集合的区别会用 Maven 或者 Gradle 导依赖引入依赖很简单4.x 版本的坐标如下dependency groupIdorg.apache.commons/groupId artifactIdcommons-collections4/artifactId version4.4/version /dependency我后面的示例默认都基于 4.x。这个版本的包名是 org.apache.commons.collections4跟老版本 3.x 的 org.apache.commons.collections 不是一个包千万别引混这一点后面我会专门讲。2. 安全取值系列getString 和它的兄弟们2.1 从最简单的 getString 看起MapUtils 最常用的能力就是安全取值。所谓“安全”核心解决三件事Map 本身为 null 时不炸key 不存在时不炸返回类型可预期看几个典型方法MapString, Object user new HashMap(); user.put(name, 张三); user.put(age, 28); String name MapUtils.getString(user, name); // 张三 Integer age MapUtils.getInteger(user, age); // 28 Long timeout MapUtils.getLong(config, timeout); // null Boolean flag MapUtils.getBoolean(config, flag); // null这段代码看着平平无奇但它背后做了我手写时经常忘掉的事内部先判断 map 是否为 null再判断 key 是否存在。你传入一个 null map它也不会抛空指针只会返回一个 null。实际业务里第三方的回调参数、配置中心拉下来的配置、RPC 返回的扩展字段动不动就是一个 Map。你根本不知道这个 Map 是 null 还是里面有值。MapUtils 就像给取值加了一层安全带。2.2 带默认值的 getXxxValue业务层最常用的一档如果说 getString 解决的是“会不会炸”那带默认值的一组方法解决的是“为 null 之后怎么办”。int pageSize MapUtils.getIntValue(config, pageSize, 10); long cacheTimeout MapUtils.getLongValue(config, cacheTimeout, 3000L); boolean enableCache MapUtils.getBooleanValue(config, enableCache, true); String env MapUtils.getStringValue(config, env, dev);这些方法在 key 不存在或者 value 为 null 的时候会直接返回你给的那个默认值。这对配置类场景特别友好写出来的代码几乎没有 if 分支。我自己的习惯是能在一行里给出默认值就绝不在外面套一个三元运算符或者 if-else。比如原来可能会写int pageSize; if (config.get(pageSize) ! null) { pageSize Integer.parseInt(config.get(pageSize).toString()); } else { pageSize 10; }换成 MapUtils 之后就是一行MapUtils.getIntValue(config, pageSize, 10)。代码短了还避免了手写 parseInt 时可能出现的各种异常。2.3 类型转换的隐藏规则强转还是解析得先分清楚用这组方法的时候很多人会踩一个隐蔽的坑Map 里的 value 到底是什么类型MapUtils 的取值方法按行为可以分成两类一类是 getString、getInteger、getLong 这种拿到 Object 之后做类型强转另一类是 getStringValue、getIntValue、getBooleanValue 这种会做一定程度的解析并给默认值区别很关键。如果你往 Map 里塞的是 String 类型的 28用 getInteger 去取它通常会做转换但如果你塞的是 Integer 类型的 28用 getString 去取某些版本里直接强转成 String 就会抛 ClassCastException。换句话说不要默认每个方法都能容忍任意类型。我个人的建议是在一个 Map 结构里同一批 value 尽量保持类型一致。如果你控制不了上游类型保险的做法是先用 MapUtils.getObject(map, key) 看一眼真正的类型再决定用哪个方法取值Object rawValue MapUtils.getObject(config, timeout); if (rawValue instanceof Number) { long timeout ((Number) rawValue).longValue(); }下面这张表是取值方法的大致分工方便你快速定位方法当 key 不存在或 value 为 null默认值参数返回类型getString(map, key)返回 null无StringgetStringValue(map, key, def)返回 def有StringgetInteger(map, key)返回 null无IntegergetIntValue(map, key, def)返回 def有intgetLong(map, key)返回 null无LonggetLongValue(map, key, def)返回 def有longgetBoolean(map, key)返回 null无BooleangetBooleanValue(map, key, def)返回 def有boolean使用前打开 JavaDoc 或者直接看源码确认你用的版本到底是强转还是解析比靠记忆猜要靠谱得多。3. 高频场景实操合并、翻转、空判断一个都不少3.1 合并 Map 的正确姿势与 null 陷阱Map 合并是业务里经常出现的操作但很多人一上来就写 map1.putAll(map2)。这句代码有两个隐藏问题map1 为 null 直接空指针map2 为 null 则会静默跳过等后面用数据时才发现少了东西。MapUtils 本身也有处理思路。如果你只是想安全合并可以先判空再 putAllMapString, String base new HashMap(); MapString, String extra getExtraMap(); if (MapUtils.isNotEmpty(extra)) { base.putAll(extra); }这里 MapUtils.isNotEmpty 同时处理了 null 和空 Map 两种场景比extra ! null !extra.isEmpty()短不少。另一个我经常配合用的是 fixedSizeMap。它返回一个固定大小的 Map一旦 put 的 key 数量超过了初始容量会直接抛异常。这个特性在容灾配置、白名单等“不允许运行时新增配置项”的场景里很有用MapString, String whitelist MapUtils.fixedSizeMap(new HashMap()); whitelist.put(order, order-service); whitelist.put(pay, pay-service); // 继续 put 新 key 会抛 IllegalArgumentException注意fixedSizeMap 限制的是 size不是不允许修改已有 key 的 value。想锁住已有值还得配合不可变 Map 使用。这块别混淆。3.2 invertMap 键值互换注意重复 value还有一类场景是键值互换。比如你有一个根据编码查名称的 Map现在想根据名称反查编码MapUtils 直接提供了一个 invertMap 方法MapString, String codeMap new HashMap(); codeMap.put(CN, 中国); codeMap.put(US, 美国); MapString, String nameMap MapUtils.invertMap(codeMap); // nameMap: {中国 - CN, 美国 - US}实现原理不复杂就是遍历原 Map把原来的 value 作为新 Map 的 key原来的 key 作为新 Map 的 value。但这里有个必须知道的坑如果原来的多个 value 是一样的翻转之后只能保留其中一个。MapString, String source new HashMap(); source.put(a, x); source.put(b, x); MapString, String inverted MapUtils.invertMap(source); // x 对应的 key 可能是 a也可能是 b取决于遍历顺序所以 invertMap 只适合 value 唯一的数据。如果数据本身有重复不要用它做反查否则会出现“查到了但查错对象”这种很难发现的 bug。3.3 isEmpty 与 isNotEmpty告别手写判空MapUtils 的 isEmpty 和 isNotEmpty 是两个被低估的小方法if (MapUtils.isNotEmpty(userMap)) { // 正常业务逻辑 }内部同时处理了 null 和 empty 两种状态。我见过不少老代码明明已经引了 Commons Collections却还在手写map ! null map.size() 0。不是说手写不对而是既然有现成的、语义更清晰的方法为什么不用还有一个容易忽略的点isNotEmpty 可以用来避免循环里反复判断。比如批量处理接口返回的 Map 列表时for (MapString, Object item : items) { if (MapUtils.isEmpty(item)) { continue; } // 处理 item }这样写后面处理 item 时就不用再担心 item 是 null 还是空 Map思路清爽很多。4. 从取数到打印MapUtils 在调试和对象转换里的妙用4.1 debugPrint快速看清一个 Map 的真面目排查问题的时候我经常要把某个 Map 的内容打印到日志里。传统做法是自己拼 entrySet或者用 IDE 的 Debug 窗口看。但线上环境没有 Debug 窗口只能靠日志MapUtils 的 debugPrint 就能派上用场MapUtils.debugPrint(System.out, userInfo, userMap);输出效果比直接 println(map) 清晰得多有明确的标签、缩进还能看到 key 对应 value 的具体类型。格式大致是这样的userInfo { name 张三 (String) age 28 (Integer) }这个输出对我来说特别有用。有一次排查线上配置问题就是靠 debugPrint 看出了某个 key 的值类型不是预期中的 String而是被 Jackson 反序列化成了 Integer顺着这条线找到了根因。注意 debugPrint 是直接输出到指定的 PrintStream不是返回字符串。用的时候一般输出到 System.out 或者日志网关的 PrintStream别把它当成一个带返回值的方法。4.2 当 Map 遇上 JavaBean工具类的边界在哪里我经常被问到一个问题MapUtils 能不能把 Map 直接转成 JavaBean答案是不能。MapUtils 的定位是“Map 结构本身的工具”它操心的只是 Map 里的存取、类型、大小这些事并不负责对象和 Map 之间的属性拷贝。你要做 Map 和 Bean 互转需要找 BeanUtils 这一类的工具而不是 MapUtils。但这不代表两者不能配合。我常用的姿势是先用 MapUtils 把 Map 里的基础字段安全取出来再手动 set 到目标对象的属性上。这样即使 Map 里的值是 nullBean 的属性也不会被破坏。如果某个 Bean 的字段特别多可以先用 BeanUtils 做一轮批量拷贝再用 MapUtils 处理那些特殊字段比如需要类型转换、需要默认值的字段。各负责一段代码反而好读。4.3 进阶玩法谓词过滤与校验型 Map如果你已经能把上面的方法用得顺手可以再进一步看看 MapUtils 的装饰类能力。predicatedMap 是一个很有意思的方法它让你在创建 Map 的时候就定义好 key 和 value 的校验规则后续任何不符合规则的 put 操作都会被拦下来MapString, Integer scoreMap MapUtils.predicatedMap( new HashMap(), PredicateUtils.notNullPredicate(), PredicateUtils.instanceofPredicate(Integer.class) );这个 scoreMap 被包装后如果你往里放一个 key 为 null 或者 value 不是 Integer 的条目put 的时候就会直接抛异常。这相当于把校验前置到写入阶段而不是等到读取时才发现数据不对。我说它是“进阶玩法”是因为大多数业务代码用不到这么细的约束而且用多了会让代码看起来有点绕。但当你写的是一个被多方调用的底层工具方法时这种前置校验可以帮调用方尽早暴露问题比线上安静地跑出一个错误结果要强得多。5. 踩坑实录版本、泛型、性能三个月后你也会遇到5.1 3.x 和 4.x 的包名分裂Commons Collections 这个库在 3.x 到 4.x 之间有一个巨大的坑包名改了。3.x 的包名是 org.apache.commons.collections4.x 的包名是 org.apache.commons.collections4。如果你在项目里同时引入了两个版本或者某些中间件传递依赖带了 3.x你自己代码里用的是 4.x那么编译可能都过不了或者在不经意间引错类。最典型的情况是import org.apache.commons.collections.MapUtils; // 3.ximport org.apache.commons.collections4.MapUtils; // 4.x两个类名都叫 MapUtils但方法签名和行为细节有差异。比如 4.x 加入了泛型支持很多方法签名看起来更“现代”了迁移的时候不能只改 import得顺手检查一下方法行为有没有变化。我的建议是新项目统一用 4.x老项目如果要升级别在同一个大版本里硬切。先把 3.x 的引用全部清理掉再用编译器逐步修正报错。5.2 泛型擦除与诡异的 ClassCastExceptionJava 的泛型在运行时是会被擦除的MapUtils 很多方法签名最终落到原始类型 Map 上。这就带来一个问题编译期看着类型都对运行期可能冷不丁给你一个 ClassCastException。举个例子如果某个 Map 实际存的是 Integer你用 MapUtils.getString 去取底层可能是直接强转成 String这时候运行期就会炸MapString, Object data new HashMap(); data.put(age, 28); // 如果底层实现是强转这里就可能 ClassCastException String age MapUtils.getString(data, age);这不是说 MapUtils 有 bug而是它的使用前提是你知道 Map 里 value 的类型。Map 本来就是一个弱类型容器工具类能帮我们挡掉 null但挡不掉“类型塞错”这种问题。我自己遇到这种情况第一反应是去调用的源头看数据到底是怎么放进去的。如果是外部接口传来的尽量在入口处做一次类型规整统一转成预期的类型再放回 Map。别指望工具类能自动帮你做“万物皆可转”。5.3 性能边界热路径上别滥用反射式转换大部分情况下MapUtils 的性能损耗小到可以忽略但有一个前提不要在超高并发的热路径上反复用它做类型转换。getXxxValue 这一系方法内部往往涉及类型判断、包装类转换、默认值处理这些逻辑放在一次请求里没感觉但如果放在一个每秒调用几十万次的循环里累积起来的开销就值得注意了。有一次我排查一个接口的耗时发现某个方法里为了取一个配置项连续调用了十几次 MapUtils.getStringValue单次平均耗时不高但放大到整个调用链之后明显拖慢了 P99。后来把配置改成启动时一次性读取并缓存成强类型字段问题立刻缓解。这里不是劝你别用 MapUtils而是希望你心里有数这种便捷方法适合做业务组装不适合做底层高频循环。真要追求性能提前把 Map 转成强类型对象再使用比任何工具类都稳。5.4 用错场景比用错方法更危险工具类的存在是为了解决通用问题但过度使用也会让代码变得不可读。我见过有人把一个很简单的两字段 Map 取值写成 MapUtils 的连环调用理由是“这样可以避免 NPE”。结果代码是安全了阅读成本却上去了。我用工具类有一条原则若一行原生代码能讲清楚就不要引入额外依赖若原生代码需要三行以上才考虑用工具类做减法。MapUtils 适合用在字段多、判空频繁、默认值多的场景比如接口返回数据组装、配置读取、日志打印。如果一个 Map 只有两三个固定字段手写判空完全没问题不必为了用而用。6. 我最后想叮嘱的三件事6.1 第一件事工具类也要翻源码很多人用工具类用成了黑盒只记方法名和参数从来不看实现。MapUtils 的源码其实写得非常清楚花二十分钟读一读 getStringValue 和 invertMap 的实现比记十篇博客都有用。我读源码时最大的收获不是知道它实现了什么而是知道它“没实现什么”。比如有些转换方法不做递归转换、有些方法对 null 有特殊语义。理解了边界才不会在业务里误用。6.2 第二件事封装之前先问一遍“真的需要吗”团队里经常有同学想在自己项目里再封装一个 XxxMapUtils把 MapUtils 的方法再包一层。我的看法是除非你要统一处理日志、埋点、监控这类横切逻辑否则直接使用 MapUtils 就好。无脑封装只会增加一层没有信息量的调用链出了问题还要多跳一层排查。如果你真的要封装也建议保留 MapUtils 的方法签名风格比如 getXxxValue 这种命名这样团队其他成员看到你的工具方法时能立刻猜到它的行为。6.3 第三件事把它当成读懂集合类的起点MapUtils 是一个很好的“解剖样本”因为它直接建立在 Map 之上代码简洁边界清晰。读懂了它你再去看 Commons Collections 里的其他工具类比如 CollectionUtils、ListUtils、SetUtils会发现它们的设计思路高度统一。这一系列的下一篇我大概率会讲 Map 的其他演进形态比如 LinkedHashMap 的顺序语义、ConcurrentHashMap 的并发细节。回头看MapUtils 只是一个入口背后真正值得花时间的是理解 Map 这种数据结构在不同场景下的行为差异。先把手上的 Map 代码用 MapUtils 收拾利索然后继续往下挖这个方向不会错。

相关新闻

含储能微网的双层能量管理MATLAB实现与优化

含储能微网的双层能量管理MATLAB实现与优化

1. 项目概述:含储能微网的双层能量管理挑战 在分布式能源快速发展的今天,微电网作为整合多种分布式电源的有效载体,其能量管理系统的智能化程度直接影响着运行经济性和供电可靠性。传统单层优化模型往往难以兼顾长期经济性和短期功率平衡&…

2026/10/14 10:03:07 阅读更多 →
SpringBoot自动配置原理与自定义Starter开发指南

SpringBoot自动配置原理与自定义Starter开发指南

1. 为什么需要理解SpringBoot自动配置第一次接触SpringBoot的开发者往往会被其"约定优于配置"的理念所震撼。只需要几行代码就能启动一个完整的Web应用,这种体验在传统的Spring框架中是不可想象的。作为一名从Spring 2.5时代走过来的开发者,我…

2026/10/14 10:03:07 阅读更多 →
51单片机电子秤系列__TIMER0_H__

51单片机电子秤系列__TIMER0_H__

#include <REGX52.H>//void Timer0Init(void) //1毫秒12.000MHz计时器T0 //{ // TMOD & 0xF0; //设置定时器模式&#xff0c;把TMOD的低4位清零&#xff0c;高4位不变 // TMOD | 0x01; //设置定时器模式&#xff0c;将前4位置0&#xff0c;不用T1计时器&#xff0…

2026/10/14 10:03:07 阅读更多 →

最新新闻

shadcn-dashboard-landing-template部署指南:Vercel、Netlify与静态托管方案对比

shadcn-dashboard-landing-template部署指南:Vercel、Netlify与静态托管方案对比

【免费下载链接】shadcn-dashboard-landing-template Accelerate your development with a sleek, open-source admin dashboard and landing page built on Vite-React, Next.js, Tailwind CSS, and Shadcn/UI which is fully customizable and production-ready. 项目地址&am…

2026/10/14 16:06:12 阅读更多 →
推箱子自动寻路实战:IDA*搜索与死锁检测优化

推箱子自动寻路实战:IDA*搜索与死锁检测优化

推箱子自动寻路&#xff0c;这东西看起来是个小游戏&#xff0c;真做起来才知道水有多深。网上讲这个主题的文章不少&#xff0c;但大多是拿BFS跑个小地图就收工&#xff0c;真正能处理中等规模关卡、能跑完不爆内存、不卡死的完整实现其实不多。我这边之前写过一个版本&#x…

2026/10/14 16:06:12 阅读更多 →
Godot TorusMesh 环面网格完整指南:参数详解、代码创建与实战应用

Godot TorusMesh 环面网格完整指南:参数详解、代码创建与实战应用

文档教程游戏开发 【免费下载链接】godot-docs Godot Engine official documentation 项目地址&#xff1a; https://gitcode.com/GitHub_Trending/go/godot-docs 点击查看 免费下载 引言&#xff1a;为什么需要 TorusMesh TorusMesh&#xff08;环面网格&#xff0c;即甜甜圈…

2026/10/14 16:06:12 阅读更多 →
Kong网关7.5分SQL注入:混合模式的信任假设错了

Kong网关7.5分SQL注入:混合模式的信任假设错了

2026 年 10 月 12 日&#xff0c;Kong Gateway 的一个 SQL 注入漏洞公开&#xff1a;CVE-2026-1907&#xff0c;CVSS v4.0 评分 7.5&#xff08;High&#xff09;&#xff0c;影响 Kong Enterprise Gateway 与开源版 Kong Gateway。漏洞的位置很具体&#xff1a;混合模式&#…

2026/10/14 16:06:12 阅读更多 →
腾讯云Python服务生产级部署:systemd+nginx+venv实战

腾讯云Python服务生产级部署:systemd+nginx+venv实战

简介&#xff1a;本资源是一份面向高校计算机专业学生与Python初学者的实战部署指南&#xff0c;聚焦疫情期间无法返校使用本地服务器时&#xff0c;如何借助腾讯云短期免费资源快速运行Python3.7PyTorch CPU版代码。文档详细覆盖从新用户微信认证领15天云服务器、CentOS/Ubunt…

2026/10/14 16:06:12 阅读更多 →
社交类iOS开发:即时通讯链路与性能优化实战地图

社交类iOS开发:即时通讯链路与性能优化实战地图

提到iOS开发&#xff0c;很多人第一反应是"不就是用Swift画页面嘛"。但如果你在招聘平台上看到"iOS应用开发工程师&#xff08;社交类应用方向&#xff09;"这个岗位&#xff0c;并且真刀真枪干过一两年&#xff0c;就会知道这几个字背后的分量。我从一线i…

2026/10/14 16:05:10 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →