前言
在 gradle学习笔记(一) 中说到 gradle学习基础: Groovy 和 DSL。所有这篇笔记就学习Groovy。先介绍groovy,然后开始学习步骤(当然主要学gradle用得到的地方)。
简介:
Groovy is a powerful, optionally typed and dynamic language, with static-typing and static compilation capabilities, for the Java platform aimed at improving developer productivity thanks to a concise, familiar and easy to learn syntax.
Groovy是一个功能强大的,灵活动态语言。它是在Java平台上的一种简洁、熟悉并且易学的语言,并大大提高了开发者的效率。
Groovy 属于脚本语言。
Groovy提供了更简单、更灵活的语法,可以在运行时动态地进行类型检查。
当Groovy脚本在执行时,Groovy会将其编译成Java类字节码,然后通过JVM来执行该Java类。 所以,在执行的时候,由于Groovy代码已经被编译为Java代码,JVM根本都不知道自己运行的是Groovy代码。这就保证了Groovy的可用性。
安装groovy
在官网 Download groovy 上,按照官网上步骤下载并安装。
自己使用的是mac,并且安装的有Homebrew,直接输入命令行就安装好了(安装HomeBrew: HomeBrew官网):
brew install groovy
安装完后输入命名行测试是否安装,安装成功会输出当前版本:
groovy -version
可以在官方上downLoad下来它的zip包,Groovy的全部文档在其中,查看起来方便的多。
Groovy 基础语法知识:
更多语法官网详细介绍: Groovy语法
- Groovy注释标记和Java一样,支持单行注释
//
、多行注释/* */
和文档注释/** */
。 - Groovy语句允许省略分号
- Groovy的所有类、方法等都为 public,除非另行指定。
Groovy支持动态类型,所有使用
def
定义变量、方法。(Groovy使用类型推断来判断)def value = "this is a string";//String.Class def value = 1;//Integer.Class println value.class;
定义函数时,也可以不指定参数的类型。
Groovy中函数的返回值也可以是类型的。
def function(var1 , var2){ ... varResult; //最后一行代码的执行的执行结果就是本函数的返回值 }
如果指定了函数返回类型,则可不必添加
def
关键字定义函数String function(var1 , var2){ ... return "StringResult"; //最后一行代码的执行的执行结果就是本函数的返回值 }
更多请看 IBM 精通Groovy,能很快了解Groovy。
- 更多请看Differences with Java,了解Groovy和Java区别。
开始介绍Groovy中的基本类型:
1. 基本数据类型
Groovy世界中所有事物皆对象,没有基本数据类型。所以Java中的byte、int、boolean、char等全是它们的包装类型。官网这么解释(其中一段):
def a = 1
assert a instanceof Integer
// Integer.MAX_VALUE
def b = 2147483647
assert b instanceof Integer
// Integer.MAX_VALUE + 1
def c = 2147483648
assert c instanceof Long
// Long.MAX_VALUE
def d = 9223372036854775807
assert d instanceof Long
// Long.MAX_VALUE + 1
def e = 9223372036854775808
assert e instanceof BigInteger
2. 容器类
Groovy中容器类有三种:
- List 链表,对应Java中的ArrayList
- Map 键值表 对应Java中的LinkedHashMap
- Range 范围,对List的扩展
2.1 List 链表
创建集合,和Java一样:
(list1) //创建新集合
def list3 = ['a', 1, 'a', 'a', 2.5, 2.5f, 2.5d, 'hello', 7g, null, 9 as byte] //可以不同类型,并且可以重复,可以为null" data-snippet-id="ext.ef9a96ec26daf03a854730e0fce9d0de" data-snippet-saved="false" data-codota-status="done">def list = [5, 6, 7, 8] //定义集合
assert list[2] == 7 //获取下标为2的值
assert list instanceof java.util.List //类型为java.util.List
def list2 = new ArrayList<String>(list1) //创建新集合
def list3 = ['a', 1, 'a', 'a', 2.5, 2.5f, 2.5d, 'hello', 7g, null, 9 as byte] //可以不同类型,并且可以重复,可以为null
获取元素:
def list = [1,'2',true,"stringFour",null];//定义数组
println list.size();//打印长度
try{
list.get(-1);
}catch(e){
println(e.toString());
}
println list[-2];//倒数第二个
println list.getAt(-2);//使用getAt()方法倒数,只能为负数
集合遍历
//第一种方式,不带下标each()方法
list.each{
println "Item $it" //it指代当前元素,是一个隐含参数
}
//带有下标,eachWithIndex()方法
list.eachWithIndex{it,i ->
println("$i : $it");
}
2.2 Map 键值表
使用 [:]
创建Map:
def map = [name:"zhangsan", "sex":true, id:123];//创建Map对象
println(map.size());
//获取值
println map.get("name");
println map.name;
//添加值
map.addone = "addedOne";
map.put("aa",false);
Map遍历:
// `entry` is a map entry
map.each { entry ->
println "Name: $entry.key Age: $entry.value"
}
// `entry` is a map entry, `i` the index in the map
map.eachWithIndex { entry, i ->
println "$i - Name: $entry.key Age: $entry.value"
}
// Alternatively you can use key and value directly
map.each { key, value ->
println "Name: $key Age: $value"
}
// Key, value and i as the index in the map
map.eachWithIndex { key, value, i ->
println "$i - Name: $key Age: $value"
}
2.3 Range 类
Ranges allow you to create a list of sequential values. These can be used as List since Range extends java.util.List.
Ranges是List的一种变体,能够很方便的创建有顺序的集合
- 使用
..
创建左右都包含的Range - 使用
..<
创建左包含,右不包含的Range
创建Ranges:
def range = 5..8;//创建左右包含的Range
range = 5..<8; //不包含8,小于8
println range.from +", " +range.to;
Range遍历:
//for循环遍历
for (i in range) {
println "Hello ${i}"
}
//each()方法遍历,和List一样
(1..10).each { i ->
println "Hello ${i}"
}
//特殊用法,用在switch语句中:
switch (year) {
case 1..10: interestRate = 0.076; break;
case 11..25: interestRate = 0.052; break;
default: interestRate = 0.037;
}
3. Groovy 导包
官方文档: Imports
groovy默认导包:
import java.lang.*
import java.util.*
import java.io.*
import java.net.*
import groovy.lang.*
import groovy.util.*
import java.math.BigInteger
import java.math.BigDecimal
以为Groovy默认导了这些包,所以可以直接用这些包里的类。更多导包方式请看官方文档。
结语:
把基本的语法和数据类型完了,已经可以开始写一些Java中的小程序了,什么打印斐波那契数列之类的。但是我们毕竟是为gradle打基础的,而且脚本语言有比groovy更好的。恩,在学习的过程也发现groovy某些地方和python好像,觉得学了groovy后,其他的相当于提前学了。恩,不错。
那么之后就要开始学习Groovy中的难点和重点了:闭包。在gradle中用的最多的就是它!!!
另附Groovy API 文档: Groovy JDK API Documentation
学习代码在 github上 github