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' } }
相关文章
「Groovy」- 常用字符串操作(String)
「Groovy」- Metaprogramming
「Apache Groovy」- 数据类型(学习笔记)
「Apache Groovy」- 语法(学习笔记)
「Groovy」- 常用 List 操作
参考文献
Java中Lambda表达式和Groovy闭包的相关解析
Is Java Lambda expression is similar logic of Groovy closure?