3.9 数学中的类似思想
从数学的角度看待函数传递的思想和Lambda表达式
3.9.1 积分
对于一个数学函数\(f(x) = x + 10\)
\[\displaystyle \int^{7}_{3}{f(x)dx} = \displaystyle \int^{7}_{3}{(x + 10)dx}
\]
图形上表现为梯形,实际计算它的面积
\(\frac{1}{2} \times ((3 + 10) + (7 + 10)) \times (7 - 3) = 60\)
用Java表达
integrate(f, 3, 7)
,其中第1个参数为数学函数,第2个参数为积分下限,第3个参数为积分上限。
注意f不能写成x+10
- x的作用域不清楚;
- 会将x+10表达式的值传给方法,而不是传递函数;
f(x)dx的数学含义为x为自变量,结果为f(x)的数学函数。
3.9.2 与Java 8的Lambda联系起来
Lambda表达了函数的含义
函数描述符为double->double
public double integrate(DoubleFunction<Double> f, double a, double b) {
return (f.apply(a) + f.apply(b)) * (b - a) / 2.0;
}
// invoke
integrate(((double x) -> x + 10), 3, 7); // 60.0
注意事项:
- Lambda表达式接收函数式接口,例如Function,而不能写成函数描述符(double -> double);
- 函数无法完全独立,必须基于对象使用,例如f.apply(a),而不能写成f(a);