Groovy入门基础


  Android的学习过程当中,对Gradle的使用是很是频繁的。so,至关有必要掌握Groovy语言,由于,Gradle用的就是这个语言,咱们要写task也是要用这个语言的。以本文做为入门Groovy的记录。本文是针对有java基础且有必定计算机基础的同窗!

基本概念

Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy代码可以与Java代码很好地结合,也能用于扩展示有代码。因为其运行在 JVM 上的特性,Groovy可使用Java来编写,最终会被编译成xx.class文件在虚拟机中运行。因为它是一种敏捷开发语言,所以很适合用来变现Gradle脚本,所以在Gradle中被普遍运用。java

环境搭建

参考:https://www.bonusbits.com/wiki/HowTo:Install_SDKMan_on_MacOS_or_Linuxweb

下载groovy的manSDK(Mac os)

$ curl -s "https://get.sdkman.io" | bash

ps:卸载sdk 
$ rm -rf $sdkHome/.sdkman

安装成功后,表示咱们能够用sdk 命令来安装groovy了!!!json

安装 groovy

sdk install groovy

看到成功后,表示groovy库安装成功。数组

下载IDEA

https://www.jetbrains.com/idea/download/#section=mac
使用免费版的就能够了!bash

配置groovy

打开IDEA — 新建Groovy项目 — Groovy library 选择你安装groovy的路径就能够了。
ps:查看groovy路径通常在:/Users/xxx/.sdkman/candidates/groovy/
在这里插入图片描述数据结构

HelloWorld

在新建的项目里,src下面新建一个groovy Class,在其中编写以下代码,运行就ok啦!
示例代码:闭包

//groovy 脚本式写法
println "Hello World!"

Groovy 语法精讲

groovy 中能够写和java如出一辙的代码,同时也能够用groovy的脚本特性,写简单的脚本语言。由于不少特性和java同样,所以这里只挑出和java不同的地方来说。curl

文件结构

在java中,一个class文件的基本结构是:ide

pacakge xx.xx

import xxxx

class xxx {
    void xxx {
        //do something
    }
}

在groovy中,就十分简单了:svg

package xx.xx (这个省了也能够运行,最好是加上,为了规范性)

//do somthing

变量类型

groovy既拥有脚本语言的特色,也拥有java的特色,所以它既可使用弱类型定义变量,也可使用强类型方式定义变量。示例以下:

//弱类型
def x = 10

//强类型
int y = 10

groovy中全部的基础类型都会被转换为对应的Class对象,好比:

基础类型 对象类型
int Integer
char Character
float Float
double Double
boolean Boolean

未指定类型的非整数,则会被转换为BigDecimal
可用以下式例验证:

def a = 0.1
println a.class

所以,在groovy中,全部的变量类型都是Object类型!

字符串

groovyz中定义字符串,有三种方式:

‘xx’

这种方式定义的字符串是不可变的,示例:

def name ='laosan'

“xx”

这是可变定义字符串,能够接受变量。示例:

def say = "hello, ${name}"

‘’‘xx’’’

这样定义的字符串,容许输入格式。示例:

def json = '''\
{
    "name":"winton",
    "age":20
}
'''

这样就不用再使用java里的转义字符了.

闭包(相似java8中的lambda表达式)

基本结构以下:
def name = { params ->
//do something
}

示例1:

def say = { String word ->
    println word
}

示例2:

def add = {a, b ->
    return a+b
}

这个有点相似函数定义

必包的使用场景

示例1:

//upto(Number self, Number to, @ClosureParams(FirstParam.class)
//是整形的一个方法,第一个参数是隐式的,第二个参数是number,第三个参数是一个闭包


def fab(number) {
    int result = 1
    //闭包是能够写在括号外面的
    1.upto(number) { num ->
        result *= num
    }
    //1.upto(number, { num -> result *= num}) 
    //
    return result
}

println fab(5)

示例2:

String temp = "asda1sad2wdasd3"

println temp.findAll { s -> s.isNumber()}

数据结构

列表

def list = [1,2,3,4,5]

列表转数组

def list = [1,2,3,4,5] as int[]

列表排序

//默认规则
list.sort()

//自定义排序规则
list.sort{c1, c2 -> return c1 > c2}

数组

int[] array = [1,2,3,4,5]

映射(map)

//定义
def students = [
                1 : "张三",
                2 : "李四",
                3 : "Jhon"
                ]
//索引
students[1]
students.get(1)

//添加
students.test = [hh:'1212'] //添加key为test,value为[hh:'1212'],还有不少种方式,这里不一一列举了

//遍历
students.each {student -> 
    println student.key
    println student.value
}

其实质是map是LinkedHashMap<Object,Object>,因此咱们能够听任任何类型的key 和value.

范围

def range = 1..10
println range[0]

//遍历
range.each {
    println it
}

本质由list实现

动态添加属性&方法(很神奇)

class Person {
    String name
    int age
}

//动态添加属性
Person.metaClass.sex = 'male'
// 动态添加方法
Person.metaClass.sayHi = { -> println "hello ${name}"}
//构造参数
def person = new Person(name:'winton', age:15)
//调用属性
println person.name
//调用动态属性
person.sex = 'fmale'
//调用动态方法
person.sayHi()

Json 操做

//序列化
println JsonOutput.toJson(person).toString()
//反序列化
def var = '''{"sex":"male","age":16,"name":"winton"}'''
JsonSlurper slurper = new JsonSlurper()
Person person1 = slurper.parseText(var) as Person

xml 操做

def xml = '''
<layer id = "231">
    <item >
        <shape>hello</shape>
    </item>
   
</layer>
'''

def xmlSlurper = new XmlSlurper()
def layer = xmlSlurper.parseText(xml)

println layer.item.shape.text()
println layer.@id

总结

本着学以致用的原则,通过以上的学习,再回头来看gradle文件彷佛就没那么迷糊了,本身写task也不会迷糊了。但愿有帮助到看到此文的同窗,也欢迎你们进群讨论!