柯里化通过预设参数、组合谓词和内置安全访问,实现清晰、可配置、可复用的多条件过滤。它将硬编码逻辑转为函数链,支持and/or组合、动态配置及防御式取值,提升可读性与健壮性。

柯里化本身不直接执行过滤,但它让多个过滤条件(谓词函数)变得可预设、可组合、可复用。在多条件过滤场景中,关键不是“用柯里化去加速”,而是用它把判断逻辑从硬编码的 filter(item => item.a && item.b > 5 && item.c?.trim()),变成清晰、可读、可配置的函数链。
把每个条件写成柯里化谓词
每个过滤维度独立封装为一个单参数函数,且支持预设参数:
-
按字段索引非空:
const byIndexNotEmpty = index => item => item[index] != null && item[index] !== ''; -
按正则匹配:
const byIndexMatches = (index, regex) => item => regex.test(item[index]); -
按嵌套路径存在且非空:
const byPathNotEmpty = path => item => { const val = path.split('.').reduce((o, k) => o?.[k], item); return val != null && val !== ''; };
用 and 或 or 组合多个谓词
定义一个高阶组合函数,接收任意数量的谓词,返回新的复合谓词:
-
全部满足(and):
const and = (...fns) => item => fns.every(fn => fn(item)); -
任一满足(or):
const or = (...fns) => item => fns.some(fn => fn(item)); - 使用示例:
data.filter(and(byIndexNotEmpty(1), byIndexMatches(0, /^\d+$/), byPathNotEmpty('meta.status')))
支持缺省跳过与安全访问
真实数据常有缺失字段或结构不一致。柯里化谓词内部可内置防御逻辑,避免每次重复写 ?. 和 ??:
- 比如
byPathNotEmpty('user.profile.name')内部自动做链式取值 + 空值判断,调用方不用关心item.user?.profile?.name的写法是否出错 - 再如
byIdLengthGt = (min) => item => item[0]?.length > min,自动处理item[0]为undefined的情况
配合动态配置灵活生成过滤器
当过滤规则来自用户选择或后端配置时,柯里化让“组装谓词”变成纯数据驱动:
- 配置项:
const rules = [{ type: 'not-empty', field: 1 }, { type: 'min-length', field: 0, value: 6 }]; - 映射为谓词:
const predicates = rules.map(r => { switch(r.type) { case 'not-empty': return byIndexNotEmpty(r.field); case 'min-length': return byIndexMinLength(r.field, r.value); } }); - 最终过滤:
data.filter(and(...predicates))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











