学习笔记-Gradle1

107 阅读4分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

一、Gradle 是什么

Gradle是构建⼯具,不是语⾔,它⽤了 Groovy 这个语⾔,创造了⼀种 DSL,但它本身不是语⾔。

即Gradle是使用Groovy语言的构建工具。

二、怎么构建?

按照 gradle 的规则(build.gradle、settings.gradle、gradle-wrapper、gradle语法)

三、为什么 Groovy 可以写出类似 JSON 格式的配置?

因为它们其实都是⽅法调⽤,只是⽤闭包来写成了看起来像是 JSON 型的格式。

注:JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式,即固定格式的字符串。

四、什么是闭包

在知乎上看到的一个回答是:

两个点,词法作用域和函数当作值传递:
词法作用域,按照代码书写时的样子,内部函数可以访问函数外面的变量。引擎通过数据结构和算法表示一个函数,使得在代码解释执行时按照词法作用域的规则,可以访问外围的变量,这些变量就登记在相应的数据结构中。
函数当作值传递,即所谓的first class对象。就是可以把函数当作一个值来赋值,当作参数传给别的函数,也可以把函数当作一个值 return。

Groovy里面的闭包

Groovy里面的闭包,我们只要知道它可以把方法作为一个参数来传递就可以了。

如下,Groovey支持以闭包(Closure)的形式传递一个方法。传递过去之后,未必是马上完成的

这是一个方法
int methodA(){
    return 5
}
这是一个闭包,一个可以被传递的方法
int methodA={
    return 5
}
当调用的时候
methodB(methodA)
void methodB(Closure someMethod){
    ...
    someMethod()
    ...
}

另外,根据Grooy语法,如果你方法传递的最后一个参数,是一个闭包的话,那么最后一参数,可以不放在括号里面。

void methodA(int value,Closure someMethod){
    
}
void methodB(Closure someMethod){
    
}
比如下面这两种写法是一样的
methodA(4,{
    println("dddd")
})
methodA(4){
    println("dddd")
}
比如下面这两种写法也是一样的
methodB({
    println("dddd")
})
methodB{
    println("dddd")
}

注意:Java里面是没有闭包的,但是有类似的东西。

Java的回调

假如我们在方法B里面调用方法A。传统情况下,在Java中,如下所示。

在这里插入图片描述

那如果我们不确定B里面到底调用的是方法A还是方法C呢?

这要求我们把方法传递过去,如下所示:

在这里插入图片描述

很明显,上面这种方式,Java是不支持的。但是Java想了个招。 我们不能传递方法,但是我们可以传递对象哇。我们可以把这两个方法包进一个类里去。然后把类的实例对象传过去,当我们需要调用的时候,想调用A就调用A,想调用C就调用C,这就相当于完成了方法传递。

这种用法其实我们经常见到,如下所示:回调,实际传的是对象,而这个对象想什么时候调用什么方法,就什么时候调用。

在这里插入图片描述

总结:如果你想传个方法做参数,想什么时候调用就什么时候调用,java不支持,但是可以通过回调的方式实现。

Java的lamda表达式

Java8的时候,简化了回调的写法,出现了lamda表达式。用于一个类或者接口只有唯一的抽象方法的情况。注意,它是一种写法。下面两图对比,这两段代码差不多,只不过lamda方式更加简化。但是你也可以看懂这个方法做的是什么,这就叫语法糖。

在这里插入图片描述

在这里插入图片描述

Kotlin的lamda表达式

下图所示传递Kotlin的lamda表达式,相当于传递了一个匿名函数 。

在这里插入图片描述

总结

  • Java 的 Lambda 表达式:是单抽象⽅法(SAM)的接⼝的匿名类对象的快捷写法,只是⼀个语法糖
  • Kotlin 的 Lambda 表达式:和匿名函数相当,实质上是⼀个函数类型的对象,并不只是语法糖。
  • Groovy 的 Lambda 表达式:Groovy ⾥不叫「Lambda」表达式,⽽是叫「闭包」;在功能上,和 Kotlin 的 Lambda ⽐较相似,都是⼀个「可以传递的代码块」,具体的功能⽐ Kotlin 的 Lambda 更强⼀些,但基本的概念是⼀样的。