gradle学习笔记(二) Groovy基础

前言

在 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"; //最后一行代码的执行的执行结果就是本函数的返回值
}

开始介绍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 Collections

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
 

猜你喜欢

转载自blog.csdn.net/huangyimo/article/details/84191596