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?