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"; //最後一行程式碼的執行的執行結果就是本函式的返回值
}
-
更多請看 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 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