函数柯里化(Currying)是将一个多参数的函数转换成一系列单参数的函数的技术。
举个例子,普通的多参数函数如:
int add(int a, int b) {
return a + b;
}
转换为柯里化版本后变为:
int add(int a) {
return (int b) -> {
return a + b;
};
}
现在 add() 变为接受一个参数并返回另一个函数的函数。所以我们可以这样调用:
int add5 = add(5);
int result = add5.invoke(10); // 结果为 15
我们将一个二元函数拆分为了两个步骤:
- add(5) 返回一个 adds5 函数
- 调用 adds5(10) 得到最终结果
柯里化的主要目的是部分应用函数。我们可以针对某些已知参数固定住,得到一个新的函数来应用剩余的参数。
实现柯里化的关键在于使用闭包包裹函数与参数,返回一个新的函数。我们以一个简单的 add 函数为例进行演示:
普通版本:
int add(int a, int b) {
return a + b;
}
柯里化版本:
int add(int a) {
return (int b) -> {
return a + b;
};
}
add() 函数现在变为返回一个函数的函数。我们可以这样调用:
int add5 = add(5);
int result = add5.invoke(10); // 15
柯里化带来的主要好处是:
- 部分应用:我们可以提前固定一部分参数,得到一个新的函数。
- 提高复用性:柯里化函数更加灵活,更容易组合和复用。
- 延迟计算:不需要立即计算最终结果,可以等到真正需要结果的时候计算。