Android中涉及到的Groovy语法

来源:互联网 发布:浙大网络线怎么用 mac 编辑:程序博客网 时间:2024/05/16 19:06

前言:

大家都知道,AndroidStudio的项目构建工具是Gradle,Gradle的代码语言是Groovy,对于一个Android应用来说,开发的时候,即使我们不懂Gradle,不懂Groovy,也是能正常开发的,但是一旦遇到相关问题,难免会手足无措,所以,搞明白这些知识点显得十分有必要。本篇blog主要是简单介绍Groovy的语言知识,完全是自己的学习笔记,能帮助到大家就最好了。

Groovy

  • Groovy 是在 java 平台上的 具有像 Python, Ruby 和 Smalltalk 语言特性的灵活动态语言 , Groovy 保证了这些特性像 Java 语法一样被 Java 开发者使用。所以熟悉java的我们学习Groovy非常得心应手。
  • 注释和java一样,java那那种注释规则完全使用
  • 不需要分号作为语句的结尾标识,显得更加简洁
  • 定义变量的时候,类型可以不申明,def关键字可有可无
varvar =1int var=1def int var =1

以上四种写法都是正确的

  • 基本数据类型和java一致,主要有byte,short,int,long,double,char,boolean,同时还有其对应的对象装饰类型
  • String字符串有三种表示方式,分别为 ‘a ’ “a” ”’a”’,和Python等类型,单引号和java的双引号一样,双引号可以利用$表示变量的值,三引号可以保证里面的内容格式完全保留。比如
var1='a'var2="hello $var"var3='''abb'''
  • 方法定义时,最后一行代码代码表示返回值,return可加可不加,指定了返回值类型可不加def,没有则必须要加def,例如
def func1(){//此时不可以省略,动态返回类型    println 'hello world'//    }String func2(){//def可以省略,返回值类型必须和定义的类型一致,不然出错'hello world'}
  • 容器类,主要有List,Map和Range
    表示为
 def list1=[1,'1',true]//和java不同,不要是同一种类型 list1[100]=2//此时list1的长度是101了def map1['key1'='value','key2'='value'],key必须是String类型,用中括号,不同于java的大括号range其实是list的扩展def list2=1..5//list2=[1,2,3,4,5]def list3=1..<5//list3=[1,2,3,4]

注意点都写在了注释上了。

闭包Closure

闭包在gradle中随处可见,只要这个特性掌握好了,再看gradle中语法就基本没有其他障碍了。
闭包在很多语言中都有,比如Kotlin的闭包,和java的lambda表达式有点类似。

1.定义格式

例如:

def aClosure = {// 闭包是一段代码 , 所以需要用花括号括起来..String param1, int param2 -> //这个箭头很关键。箭头前面是参数定义,箭头后面是代码println "this is code" //这是代码,最后一句是返回值,}

定义格式如下:

def xxx = {paramters -> code} //或者def xxx = {无参数,纯 code} 这种 case 不需要->符号

同时,如果闭包只有一个参数,默认为it,可以不显式指定

def closure1={println "hello $it"}

2.省略圆括号
如果一个函数最后一个参数是Closure对象,那么调用该函数时就可以省略该方法括号

public static <T> List<T> each(List<T> self, Closure closure)//self这个参数值该类对象,调用方法时不传,和Python类似def iamList = [1,2,3,4,5] //定义一个 ListiamList.each{ //调用它的 each,这段代码的格式看不懂了吧?each 是个函数,圆括号去哪了?println it}

在gradle中,我们会看到很多省略括号的写法,值保留大括号,现在想想是不是这么回事呢

高级特性

1.XML 操作
Groovy 中,XML 的解析提供了和 XPath 类似的方法,名为 GPath。这是一个类,提供相应 API
例子为:text.xml文件

<response version-api="2.0"><value><books><book available="20" id="1"><title>Don Xijote</title><author id="1">Manuel De Cervantes</author></book><book available="14" id="2"><title>Catcher in the Rye</title><author id="2">JD Salinger</author></book><book available="13" id="3"><title>Alice in Wonderland</title><author id="3">Lewis Carroll</author></book><book available="5" id="4"><title>Don Xijote</title><author id="4">Manuel De Cervantes</author></book></books></value></response>

下面利用GPath进行解析操作:

//第一步,创建 XmlSlurper 类def xparser = new XmlSlurper()def targetFile = new File("test.xml")//轰轰的 GPath 出场GPathResult gpathResult = xparser.parse(targetFile)//开始玩 test.xml。现在我要访问 id=4 的 book 元素。//下面这种搞法,gpathResult 代表根元素 response。通过 e1.e2.e3 这种//格式就能访问到各级子元素....def book4 = gpathResult.value.books.book[3]//得到 book4 的 author 元素def author = book4.author//再来获取元素的属性和 textvalueassert author.text() == ' Manuel De Cervantes '获取属性更直观author .@id == '4' 或者 author['@id'] == '4'属性一般是字符串,可通过 toInteger 转换成整数author.@id.toInteger() == 4

好了。GPath 就说到这。再看个例子。我在使用 Gradle 的时候有个需求,就是获取
AndroidManifest.xml 版本号(versionName)。有了 GPath,一行代码搞定,请看

def androidManifest = new XmlSlurper().parse("AndroidManifest.xml")println androidManifest['@android:versionName']或者println androidManifest.@'android:versionName'

以后AndroidManifest.xml文件的相关信息都可以轻松的写在gradle文件中了,不是吗?

原创粉丝点击