groovy 學習
一、groovy 的環境安裝
centos下的安裝
$ curl -s get.sdkman.io | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
$ sdk install groovy
$ groovy -version
windows下的安裝
官網下載安裝包后解壓,配置環境
?新建GROOVY_HOME,值為解壓后文件的路徑。
修改PATH,在最后追加%GROOVY_HOME%\bin
二 groovy的基礎語法
groovy的變量
創建.Groovy Script文件
package variable
//groovy 中變量最后都會被包裝成對象類型
int x = 10
println x.class //Integer
double y = 1.14
println y.class // Double
//groovy 定義變量的類型,使用def快速定義弱類型,推斷數據類型
def x_1 =2
println x_1.class
def y_1 = 3.15
println y_1.class
def name = 'david'
println name.class
三、groovy中的字符串用法
def str = 'a \'a\' string '
println str
println str.class
//三個引號定義的字符串可以指定格式
def thupleStr = '''\
three
signle
string'''
println thupleStr
println thupleStr.class
//雙引號字符串格式,可一再字符串中引用其他字符串,引用其他變量后類型是groovy.runtime.GStringImpl
def name = "david"
def doubleName = "name: ${thupleStr}"
println doubleName
println doubleName.class
//雙引號中的擴展接受任意的表達式
def sum = "the sum of 2 and 3 equals ${2 + 3}"
println sum
//測試GString 和String 的轉換.編譯器轉換
def result = echo(sum)
println result
println result.class
String echo(String message){
return message
}
/*******字符串String 常用方法 *********************/
def str1 = "justTest"
//println st1.center(9,'a')//字符串兩邊填充字符,默認填充空格。先右后左
//println str1.padLeft(10,'a')//字符串右側填充
//字符串比較
def str2 = "hello"
println str1>str2
println str2[0] //獲取下標的值
println str2[0..3] //獲取下標范圍的值
println str2.minus("ello") //等同于 石str1 - str2
println str2.reverse() //字符串反轉
println str2.capitalize() //首字母大寫
四、groovy中的邏輯控制
package variable
//邏輯控制
// switch語句
def x = 1.23
def result
switch (x){
case 'foo':
result="founf foo"
break
case 'bar':
result = 'bar'
break
case [1.23,5,6,'inList']: //列表中的結果匹配
result = 'list'
break
case 12..30:
result = 'range'
break
case Integer:
result = 'integer'
break
case BigDecimal:
result = 'bigDecimal'
break
default:result = 'default'
}
println result
// for循環 計算0-9的和
def sum = 0
for(i in 0..9){
sum+=i
}
println 'sum:'+sum
//對于List中元素循環
def sum1 = 0
for(i in [1,2,3,4,5,6,7,8,9]){
sum1 += i
}
println "sum1:"+sum1
// 對MAP進行循環
def sum2 =0
for(i in ['xiaoMing':1,'xiaoQiang':2,'xiaoHua':3]){
sum2 += i.value
}
println 'sum2:'+sum2
五、閉包
閉包的定義
閉包是代碼塊。定義如下
//*******閉包的定義和參數********
def closure = {println "close package"}//閉包的定義方式
closure.call()//調用閉包方法的兩種方式
//closure()
def close = {String name -> println "hello ${name}"}//有參數的閉包定義
close("david")
//多個參數
def close1 = {String name,Integer age-> println "hello :${name}&${age}"}
close1("pangpang",12)
//閉包方法的隱式參數it
def close2 = { println "hello ${it}"}
close2("david")
//*********閉包的返回值**********
def close3 = { println "test return ${it}"}
def result = close3("test")
println result //閉包方法必定有返回值,默認返回null
閉包的用法
//閉包求階乘
int fab(number){
int result = 1
1.upto(number,{num->result *=num})//upto 實現循環階乘
return result
}
println "向上階乘:"+fab(5)
int fab2(int number2){
int result = 1
number2.downto(1,{num->result *=num})
return result
}
println "向下階乘:"+fab2(7)
//累計求和方法,這里的次數由0開始,所以不能用于階乘的計算
int cal(int number){
int sum = 0
number.times{ num->sum+=num }
return sum
}
println cal(101) // 計算0-100的結果
//*********字符串在閉包的使用
String str ="string test 1"
str.each {
// String result -> print result.multiply(2) //每個字符串輸出兩次
}
//查找滿主條件的第一個元素
str.find{
String s->s.isNumber() //必須是一個返回布爾類型的閉包
}
//查找滿主條件的所有元素
def list = str.findAll{
String s -> !s.isNumber()
}
println "列表:"+list.toListString()
//判斷字符串是否滿足某個條件
def res = str.any {
String s-> s.isNumber()
}
println "res:"+res
//是否每一項滿足某個條件
println "every:"+str.every {String s-> s.isNumber()}
//對字符串中每一項處理
def list2 = str.collect {
it.toUpperCase()
}
println "list2:"+list2.toListString()
閉包的三個重要變量
this、owner、delegate三個關鍵字
this代表定義閉包的類。
owner代表閉包定義處的類或者對象,閉包內部定義閉包中的owner是外層的閉包
deleGate 代表任意的對象,默認值就是owner
如果在類或者方法中定義閉包,此時this,owner,deleGate是一樣的,指向閉包定義處的實例或者類本身
如果在閉包中定義閉包,this指向的仍然是閉包處的實例或者類本身,而owner和deleGate指向的最近的閉包對象。
//定義一個內部類 , 三個變量指向最近的封閉類
class Person{
def classClosure = {
println "classClouser this"+this
println "classClouser this"+owner
println "classClouser this"+delegate
}
def say(){
def methodClosure = {
println "methodClouser this"+this
println "methodClouser this"+owner
println "methodClouser this"+delegate
}
methodClosure.call()
}
}
Person person = new Person()
person.classClosure.call()
person.say()
//在閉包中中定義閉包
def nestClouser = {
def innerClouser = {
println "innerClouser this"+this
println "innerClouser this"+owner
println "innerClouser this"+delegate
}
innerClouser.delegate = person // 修改默認的deleGate.此時deleGate指向person對象
innerClouser.call()
}
//this 指向實例本身或者定義處的類,owner和deleGate表示的是距離最近的閉包
閉包的委托策略
//委托構造
class Student{
String name
def pretty = {
println "my name is ${name}"
}
String toString(){
pretty.call()
}
}
class Teacher{
String name
}
Student student = new Student(name: "jane")
Teacher teacher = new Teacher(name: "lay")
student.toString();
student.pretty.delegate = teacher // 將閉包中的delegate指向teacher
student.pretty.resolveStrategy = Closure.DELEGATE_FIRST //修改委托策略為 deleGate 默認是owner
student.toString() //此時會在委托的類中尋找name屬性,找不到會回來本身類的內部尋找
智能推薦
Gradle學習之Groovy語法篇
Groovy-lang語法篇 前言: 大家現在開發Android的大部分都已經擁抱了Android Studio了,擁抱太久了就想搞點事情,我就是搞事情的哈。接下來將我的一些心得體會給大家分享一下。下面先給大家亮一下我后面寫文章的知識體系圖 首先學習Groovy語法 1.0 什么是Groovy 本章介紹Groovy編程語言的語法。語言的語法源自Java語法,這句話的意思也就是說你可以在Groovy...
Groovy語言學習--語法基礎(4)
語法基礎到此就結束了,畢竟其和Java許多地方并無差別。groovy作為腳本,是為了能更好地隨業務變化調整規則,我根據自己對規則的理解 通過一張圖簡單描述一個groovy腳本場景:由于貨幣膨脹,經濟收縮等未來一年的報價策略是變動的而且是未知的,可能到2019年的時候我們需要重新 寫一個報價策略在代碼中維護,為了不變更項目代碼和服務停機等故障,通常我們會寫一個規則引擎,當然我們也可以通過groovy...
groovy基礎語法學習
數據類型 String 邏輯控制 數據結構 閉包 面向對象 創建接口 創建抽象接口 構建對象 具體操作 groovy 運行時時序表 json操作 xml操作 file操作...
Gradle學習之二Groovy核心語法
文章目錄 一、基礎語法 二、String講解 2.1 三種定義方式 2.2 新增操作符 三、邏輯控制 四、閉包 4.1 閉包基礎講解 4.2閉包的使用 4.3 閉包進階 五、數據結構 5.1 列表 5.1.1 列表與數組的定義 5.1.2 列表操作 5.2 映射 5.2.1 定義 5.2.3 使用 5.3 范圍 六、面向對象 6.1 定義類 6.2 元編程 一、基礎語法 groovy中沒有基本數據...
猜你喜歡
Groovy語法學習(三) 擴展方法
groovy為jdk增加了很多擴展方法,讓我們更加方便的使用,這里我們就來實現一下自己的擴展方法。首先我們先看一下groovy的擴展方法是如何實現的。 groovy中我們可以這樣使用 其實和自己調用沒什么區別,閉包也是實現了Runnable接口的。 那么我們就明確了,擴展方法無非就是就是在一個類里定義一個靜態方法。第一個參數必須是對應的類型。 我開始自己的項目。 在Intellij中,我們新建一個...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...