如果闭包的定义如此简单,请参看百度百科对闭包的定义:
闭包包含自由(未绑定到特定对象)变量;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。
简单来说,就是可以绑定变量作用域,那么很显然,JAVA是完全支持闭包的,如下:
static IntFunction<Integer> sumEx(int a) {
// 定义局部变量
final int ex = a * 10;
return new IntFunction<Integer>() {
@Override
public Integer apply(int value) {
// 引用局部变量
return ex + value;
}
};
}
上述代码可以进一步简化,如下:
static IntFunction<Integer> sumEx(int a) {
// 定义局部变量
final int ex = a * 10;
// 自动类型推导,这是JAVA 8最牛的精华
return (value) -> {
// 引用局部变量
return ex + value;
};
}
测试代码如下:
// 获取闭包函数
IntFunction<Integer> fun10 = sumEx(10);
IntFunction<Integer> fun20 = sumEx(20);
// 输出111
System.out.println(fun10.apply(11));
// 输出211
System.out.println(fun20.apply(11));
结论
- JAVA支持变量作用域,完全支持闭包;
- 并不是只有函数式编程语言才支持闭包,见代码片段1,完全是面向对象的写法;
- 相比与Javascript等函数式编程语言,由于final的限定,JAVA并不支持对变量作用域值的修改;
- 由于JAVA严格的面向对象设计语言,对于函数的调用必须加上对象名限定(如类名、实例名及接口名称);
- 闭包没有那么神奇,也没有那么高不可攀;