文章目录
- 一、闭包概念
- 二、Java 中函数作为参数的替代方案 ( 匿名内部类 )
一、闭包概念
匿名函数 就是 Lambda 表达式 , 同时也是 闭包 , 三者的是相同的概念 ;
闭包意义 :
在 Java 中 , 通过 Package 包 , Class 类 , 将作用域区分开 ,
将变量 定义在 不同的 包 或 类中 , 可以很明显的将作用域区分开 ;
如果没有 Class 类 , 在一个 脚本文件 中 , 如 Kotlin 的脚本 , 就需要 使用 函数 进行作用域区分 ,
将一个作用域内的相关代码 , 都写在一个函数中 , 这样就可以将作用域分区分开 ;
匿名函数 作用域 :
在 匿名函数 / Lambda 表达式 / 闭包 中 , 可以 引用 作用域 之外的变量 ,
如 :
在 函数 A 中定义了 匿名函数 B , 则 在 匿名函数 B 中 , 可以引用 函数 A 中的变量 和 全局变量 ;
在 匿名函数 B 中定义了 匿名函数 C , 则 在 匿名函数 C 中 , 可以引用 匿名函数 B , 函数 A 中的变量 和 全局变量 ;
在 函数 A 中 , 不能引用 匿名函数 B 和 匿名函数 C 中的变量 ;
在 匿名函数 B 中 , 不能引用 匿名函数 C 中的变量 ;
高级函数概念 :
在 函数式编程 中 , 经常使用 高级函数 , 高级函数 是使用 函数类型变量 作为 参数 或 返回值 的 函数 ;
使用 匿名函数 / Lambda 表达式 / 闭包 作为 参数 / 返回值 的函数 是 高级函数 ;
Kotlin 中经常使用 链式调用 , 就是 函数式编程 的风格 ;
二、Java 中函数作为参数的替代方案 ( 匿名内部类 )
Kotlin 中引入 函数类型 , 将 匿名函数 / Lambda 表达式 / 闭包 作为 函数参数 或 返回值 , 可以写出 更加灵活的代码 ;
Java 8 开始 支持 Lambda 表达式 , 但是 不支持 函数 作为参数 , 也 不支持将 函数 赋值给变量 ;
Java 语言 将 函数 作为参数 的 替代方案 是 : 使用 匿名内部类 作为函数参数 ;
代码示例 : Java 代码中 , 接收 OnClickListener listener
类型的接口类型参数 , 在实际使用时 , 可以传入一个匿名内部类作为参数 , 将函数实现在匿名内部类中 ;
public class JavaMethod {
public static void main(String[] args) {
setClick(new OnClickListener() {
@Override
public void click() {
System.out.println("On Click");
}
});
}
public interface OnClickListener {
void click();
}
public static void setClick(OnClickListener listener) {
listener.click();
}
}
执行结果 :