「Groovy」- Closure

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?