【Gradle系列】Groovy基礎編程知識2

引言

上一節,咱們瞭解了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]
複製代碼

經常使用數據結構之map

(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的運行時注入屬性/方法等能夠實現

json操做

(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
複製代碼

XML操做

(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
}
複製代碼

結尾

哈哈,該篇就寫到這裏(一塊兒體系化學習,一塊兒成長)

相關文章
相關標籤/搜索