上一節,咱們瞭解了Gradle的基礎編程知識1,涉及字符串/數組/集合等;java
本章咱們將學習系列的基礎編程知識2,如:列表/map/數組/範圍等經常使用數據結構,對象使用,文件操做等編程
(1)列表的定義:json
def list = [1, 3, -1, -2]
printlin list.class
複製代碼
(2)列表的排序:數組
printlin "默認排序規則,排序後:" + list.sort().toListString()
printlin "指定排序規則,排序後:" + list.sort {a, b ->
a == b ? 0 :Math.abs(a) < Math.abs(b) ? 1 : -1
}.toListString()
複製代碼
(3)列表的查找:markdown
//打印偶數
printlin list.find { return it % 2 == 0 }.toListString()
//打印基數
printlin list.find { return it % 2 != 0 }.toListString()
//打印all
printlin list.toListString()
//任意偶數
printlin list.any { return it % 2 == 0 }.toListString()
//全部基數
printlin list.every() { return it % 2 != 0 }.toListString()
複製代碼
定義:數據結構
def arr = [1, 2, 3, 4] as int[]
int[] arr2 = [1, 2, 3, 4]
複製代碼
(1)定義:app
def map = [
red : '0xffff',
blue: '0xooo'
]
複製代碼
(2)索引:ide
printlin map['red']
printlin map.red
複製代碼
(3)添加元素:post
map.add = '0xccc'
printlin map.toMapString()
複製代碼
(4)遍歷:學習
def map2 = [
1: [age: '16', name: 'davi'],
2: [age: '15', name: 'xiaoming'],
3: [age: '7', name: 'xiaohong']
]
map2.each { obj ->
printlin "each的遍歷:key is ${obj.key}, value is ${obj.value}"
}
複製代碼
(5)查找:
printlin "年齡爲16的:" + map2.find { def o -> return o.value.age == 16 }.toMapString()
printlin "年齡大於0的:" + map2.findAll { def o -> return o.value.age > 0 }.toMapString()
printlin "年齡大於0的數量有:" + map2.count { def o -> return o.value.age > 0 }.toMapString()
printlin "年齡大於7的同窗名稱有:" + map2.findAll {
def o -> return o.value.age > 7
}.collect {
return it.value.name
}.toMapString()
複製代碼
(1)定義:
def rang = 1..10
println "範圍的第一個元素:" + rang[0]
println "範圍的開始元素:" + rang.from
println "範圍的最後一個元素:" + rang.to
複製代碼
(2)遍歷
rang.each {
println "循環:" + it
}
複製代碼
(3)結合case應用:
首先定義一個方法
String rangResult(Number number) {
def result = "默認值"
switch (number) {
case 0..<60:
result = "不及格"
break
case 60..<70:
result = "及格"
break
}
return result
}
複製代碼
而後方法的使用
println "成績:" + rangResult(65)
複製代碼
(1)定義:
class Person implements IAction, GroovyObject, Serializable {
String name int age def incAge() {
return name + age
}
@Override
void eat() {
println "-- eat --"
}
def invokeMethod(String methodName, Object param) {
return "methodName is : ${methodName}, param is : ${param}"
}
}
複製代碼
(2)對象的訪問
def p = new Person(name: "davi", age: 18)
println "name is : ${p.name}"
println "from obj,name is : ${p.getName()}"
println "age is : ${p.age}"
複製代碼
(3)對象的元編程思想
在java中,若是類中方法沒有,那邊會直接編譯報錯;
可是在groovy中,沒有方法編譯是不會報錯的,只有在運行時候纔會去執行一個機制,這個機制以下:
類中方法是否存在?
(1)存在,直接調用
(2)不存在,MetaClass中是否有此方法
(2.1)存在,直接調用
(2.2)不存在,是否重寫類methodMissing方法
(2.2.1)有重寫,直接調用
(2.2.2)沒有重寫,再看下是否重寫了invokeMethod方法
(2.2.2.1) 有重寫,直接調用
(2.2.2.2) 沒有重寫,throw MissingMethodException異常
複製代碼
(4)動態添加屬性
Person.metaClass.sex = 'boy'
def p1 = new Person(name: "davi", age: 18)
printlin "動態添加的屬性sex爲:" + p1.sex
複製代碼
(5)動態添加方法
Person.metaClass.sexPrint = { -> printlin "sexPrint 裏面的sex = " + sex }
def p2 = new Person(name: "davi", age: 18)
p2.sexPrint()
複製代碼
(6)動態添加屬性/方法的好處:
正常來講,咱們須要在第三方庫的一個類裏面添加屬性或者方法,通常會選擇繼承,而後添加方法;
可是,若是類是一個final類,那麼繼承的方式就不行了
採用groovy的運行時注入屬性/方法等能夠實現
(1)對象轉json字符串
def list = [
new Person(name: 'davi1', age: 18),
new Person(name: 'davi2', age: 19)
]
println "對象轉json字符串:" + JsonOutput.prettyPrint(JsonOutput.toJson(list))
複製代碼
(2)json 轉對象
def json = ''' { "name": "davi", "age": "18" } '''
def j = new JsonSlurper()
println "json 轉對象 : name is " + j.parseText(json).name
複製代碼
(1)xml解析
def xml = ''' <note> <to>George</to> <from>John</from> <heading>Reminder</heading> </note> '''
def xmlP = new XmlSlurper()
def xmlObj = xmlP.parseText(xml)
println "xml to is " + xmlObj.note
複製代碼
(2)xml生成
經過以下代碼:
def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw)
xmlBuilder.langs(type: 'cur') {
language(flavor: 'static', 'kotlin')
}
println "my xml is : " + sw
複製代碼
生成以下格式的xml:
<langs type = 'cur'>
<language flavor = 'static'>kotlin</language>
</langs>
複製代碼
(1)基本操做
//定義
String sourcePath = "你的文件路徑"
def file = new File(sourcePath)
//一行行讀取
file.eachLine { line ->
println "eachLine模式讀取每一行:" + line
}
//讀取文件部份內容
def reader = file.withReader { render ->
char[] buffer = new char[100]
render.read(buffer)
return buffer
}
println "讀取文件部份內容 : " + reader
複製代碼
(2)文件拷貝
static def copy(String sourcePath, String desc) {
try {
def descFile = new File(desc)
if (!descFile.exists()) {
descFile.createNewFile()
}
//開始拷貝
new File(sourcePath).withReader { render ->
def lines = render.readLines()
descFile.withWriter { writer ->
//一行行寫入
lines.each { line ->
writer.append(line + "\r\n")
}
}
}
//ok
return true
} catch (Exception e) {
e.printStackTrace()
}
//default
return false
}
複製代碼
(3)對象存儲到文件
static def saveObj(Object o, String path) {
try {
def descFile = new File(path)
if (!descFile.exists()) {
descFile.createNewFile()
}
descFile.withObjectOutputStream { out ->
out.writeObject(o)
}
//ok
return true
} catch (Exception e) {
e.printStackTrace()
}
//default
return false
}
複製代碼
(4)從文件中讀取對象
static def readObj(String path) {
def obj = null
try {
def descFile = new File(path)
if (descFile == null || !descFile.exists()) {
return null
}
descFile.withObjectInputStream { inputStream ->
obj = inputStream.readObject()
}
return obj
} catch (Exception e) {
e.printStackTrace()
}
//default
return null
}
複製代碼
哈哈,該篇就寫到這裏(一塊兒體系化學習,一塊兒成長)