柯里化是将多参数函数转换为单参数函数并返回新函数的技术;在格式化输出中可预设模板与规则,生成语义清晰、可复用的专用函数,支持默认值、类型转换及模板字面量集成。

柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。在格式化输出场景中,它能让你预先设定格式模板和部分参数,生成可复用、语义清晰的专用工具函数。
用柯里化封装通用格式化逻辑
核心思路是:把格式字符串(如 "{name} 今年 {age} 岁")和替换规则作为固定参数传入,返回一个接收实际数据对象的函数。这样每次调用只需传入具体数据,无需重复写模板或正则逻辑。
示例实现:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const format = (template) => (data) => {
return template.replace(/\{(\w+)\}/g, (match, key) => {
return data[key] !== undefined ? data[key] : match;
});
};
<p>// 柯里化后定制专用函数
const formatUser = format("{name} 今年 {age} 岁,住在 {city}");
const formatLog = format("[{level}] {time} - {msg}");</p><p>console.log(formatUser({ name: "张三", age: 28, city: "杭州" }));
// → "张三 今年 28 岁,住在 杭州"</p><p>console.log(formatLog({ level: "ERROR", time: "10:25", msg: "网络超时" }));
// → "[ERROR] 10:25 - 网络超时"
</p>支持默认值与类型安全的增强版
真实项目中常需处理缺失字段或做简单类型转换(如日期、金额)。可在柯里化第二层加入配置项,让定制更灵活:
- 用
defaults提供字段默认值,避免undefined渲染 - 用
transformers对特定字段做预处理(如price自动加 ¥ 符号) - 保持柯里化链式结构:
format(template)(options)(data)
const format = (template) => (options = {}) => (data) => {
const { defaults = {}, transformers = {} } = options;
<p>return template.replace(/{(\w+)}/g, (match, key) => {
const https://www.php.cn/link/d2aba651bbae6cdf365887ca20f519d6 = data[key] !== undefined ? data[key] : defaults[key];
const value = transformers[key] ? transformers<a href="https://www.php.cn/link/d2aba651bbae6cdf365887ca20f519d6">key</a> : https://www.php.cn/link/d2aba651bbae6cdf365887ca20f519d6;
return value == null ? match : String(value);
});
};</p><p>// 定制带默认值和价格格式化的函数
const formatProduct = format("{name} ¥{price}(库存:{stock})")({
defaults: { stock: 0 },
transformers: { price: (v) => Number(v).toFixed(2) }
});</p><p>console.log(formatProduct({ name: "iPhone", price: 5999 }));
// → "iPhone ¥5999.00(库存:0)"
</p>配合模板字面量与标签函数进一步简化
如果项目已用 ES6 模板字面量,可将柯里化与标签函数结合,让调用更自然:
- 定义
format`...`标签函数,内部仍走柯里化逻辑 - 首次调用传模板,返回接收
data的函数,支持链式或直接调用 - 语法上接近原生模板,但保留动态定制能力
const format = (strings, ...keys) => (data) => {
return strings.reduce((acc, str, i) => {
const key = keys[i];
const value = key && data[key] !== undefined ? data[key] : '';
return acc + str + value;
}, '') + strings[strings.length - 1];
};
<p>// 使用方式(注意反引号)
const greeting = format<code>Hello, ${'name'}! You are ${'age'} years old.</code>;
console.log(greeting({ name: "Alice", age: 30 }));
// → "Hello, Alice! You are 30 years old."
</p>实际使用建议
柯里化不是银弹,要注意适用边界:
- 适合模板固定、数据动态的场景(日志、提示文案、API 错误消息等)
- 避免过度嵌套,三层以上柯里化会降低可读性;两层(模板 → 配置 → 数据)最实用
- 若格式逻辑复杂(如条件分支、嵌套渲染),建议改用模板引擎或组件化方案
- 搭配 TypeScript 可为
data参数添加接口约束,提升类型安全性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










