1. 程式人生 > >gradle學習筆記(二) Groovy基礎

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