Closure – 闭包
在 Java 中的 Lambda 和 Groovy 的 Closure 非常相似,但是底层的实现机制是非常不同的。
简单示例
对于一个「闭包」的简单使用如下:
// 声明一个闭包
Closure listener = { e -> println "Clicked on $e" }
// 两种调用方式
listener("str")
listener.call("str")
调用方式两种:以函数的方式调用;或者调用 call()方法。
作为参数传递
「闭包」也可以作为方法的参数传入。类似于“传递函数的调用”。看下面的示例:
class DelegateDemo {
static void main(String[] args) {
Closure c = {
test() // 调用代理对象的方法
}
c.delegate = new DelegateDemo() // 设置代理对象。在 Closure 中有一个属性为 delegate,该属性表示我们可以为闭包设置一个代理对象
c.call() // 运行闭包。即,调用代理对象的 test()方法
}
void test() {
println("this is delegate")
}
}
# 利用 Groovy 模仿 Gradle 中的 dependencies 依赖声明
// // 该类同时将作为一个闭包的代理对象。
class Dependency {
Set<String> api = new HashSet<>(); // 保存所有的依赖
// 这就是一个普通的方法
void api(String text){
api.add(text)
}
// 这就是一个普通的方法
void exec(){
println(api)
}
}
// // 声明一个方法,该方法的参数为一个闭包。
static void dependencies(Closure closure) {
println "Start Dependencies……"
def dependency = new Dependency() // 声明一个代理对象
closure.delegate = dependency // 设置委托
closure.call() // 运行闭包
dependency.exec() // 执行
}
// // 使用
static void main(String[] args) {
dependencies {
api 'cn.jiguang.sdk.plugin:xiaomi:3.1.0'
api 'cn.jiguang.sdk.plugin:huawei:3.1.0'
api 'cn.jiguang.sdk.plugin:meizu:3.1.0'
}
}
参考文献
Java 中 Lambda 表达式和 Groovy 闭包的相关解析
Is Java Lambda expression is similar logic of Groovy closure?