java8函数式编程笔记-科里化

本文深入探讨了Java函数式编程中的科里化技术,介绍了无副作用函数的概念,以及如何通过科里化实现代码模块化和重用。通过单位转换的例子,展示了科里化在实践中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java函数式编程-科里化

什么是函数?

在数学上,函数的定义为“它接受零个或多个参数,生成一个或多个结果”
而在java8中,函数的定义为像数学函数一样没有副作用的函数
复制代码

什么是副作用?

如果一个方法既不修改它内嵌类的状态,也不修改其他对象的状态,
使用return返回所有的计算结果, 那么我们称其为纯粹的或者无副作用的。
简单点说,如果一个方法在执行的时候修改了另一个对象的数据,导致两次同样的输入返回不同的结果
那么这个方法就是存在副作用。
复制代码

科里化

它是一种可以帮助你模块化函数,提高代码重用性的技术
复制代码

在给出科里化定义前,我们先看一个例子:

应用程序通常会有国际化需求,将一套单位转换到另一套单位是经常遇到的问题 单位转换通常涉及到转换因子和基线调整因子的问题,比如,将摄氏度转到华氏度的公式是: CtoF(x) = x * 9/5 + 32; 所有的单位转换几乎都遵行下面这种模式: (1) 乘以转换因子 (2) 如果需要,进行基线调整 你可以用下面的代码表示这一模式:

static double converter (double x, double f, double b) {
	return x * f + b;
}
复制代码

这里x是你希望转换的参数,f是转换因子,b是基线值。

上述代码虽然能得到我们希望的数据,但是有些过于宽泛了,通常,你还需要在同一类单位之间进行转换,比如公里和英里。当然,我们也可以每次调用converter方法,同时传入3个参数,但是这太繁琐了,换一种说法,我们应该要向数学方向的函数看齐,也就是f(x)这样的格式。因此,这里就可以改成一个简单的类似于工厂的模式,利用java8的新特性函数接口。

static DoubleUnaryOperator curriedConverter (double f, double b) {
	return (double x) -> x * f + b;
}
复制代码

该方法通过传入转换因子和基线值返回一个函数。 现在,我们可以像数学函数一样调用对应的方法了

DoubleUnaryOperator convertCtoF = curriedConverter (9.0/5, 32);
//由于DoubleUnaryOperator定义了方法applyAsDouble,你可以像下面一样使用这个函数
double f = convertCtoF.applyAsDouble(37);
复制代码

这样一来,你只需要在最开始的时候获取对应的函数,之后就直接跟数学函数一样使用就好了。 让我们来总结一下上述步骤: 首先你并没有每次传递3个参数。而是先传入2个参数f和b来生成函数并返回。返回的方法会接收参数x,也就是我们希望进行转换的值,最终返回x * f + b。通过这种方法,我们复用了现有的转换逻辑,同时又为不同的转换因子创建了不同的转换方法

科里化的定义

科里化是一种将具备2个参数(比如x,y)的函数f转化为使用一个参数的函数g,
并且这个函数的返回值也是一个函数,他会作为新函数的一个参数
后者的返回值和初始函数的返回值相同,即
f(x, y) = (g(x)) (y)
当然最终的解释便是:他表示一种将一个带有n元组参数的函数转换成n个一元函数链的方法
这种概念最早由俄国数学家Moses Schönfinkel引入,
而后由著名的数理逻辑学家哈斯格尔·科里(Haskell Curry)丰富和发展,科里化由此得名。
复制代码

一个函数使用所有参数仅有部分被传递时,通常我们说这个函数是部分应用的(partially applied)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值