RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Gradle入門知識之Gradle語法2

jf_78858299 ? 來源:小余的自習室 ? 作者:小余的自習室 ? 2023-03-30 10:54 ? 次閱讀

5.閉包

閉包在我們groovy中起著很大比重,如果想要學好groovy,閉包一定得掌握好,

在我們build.gradle其實就有很多閉包使用:

如:

android{
    sourceSets {
        main{
                jniLibs.srcDirs = ['libs']
        }
    }
}

這里面的

android {}

其實就是一個閉包結構,其內部的sourceSets{}又是閉包中的閉包,可以看到閉包在我們的gradle中無處不在.

學好閉包真的很關鍵

常用閉包方式:

{'abc'}
{ -> 'abc'}
{ -> "abc"+$it}
{ String name -> 'abc'}
{ name -> "abc${name}"}
{ name,age -> "abc${name}"+age}

5.1:閉包的定義及基本方法

  • 閉包概念:其實就是一段代碼段,你把閉包想象為java中的回調Callback即可,

    閉包在Groovy中是groovy.lang.Closure 的實例,可以直接賦值給其他變量.

  • 閉包的調用

def closer = {1234}
closer()
closer.call()
  • 閉包參數:帶參數的閉包 使用 -> 如果是一個參數可以直接使用it代替和kotlin中的lambda類型類似
def closerParam = { name,age ->
    println "hello groovy:${name}:${age}"
    'return hei'
}
def result = closerParam("lily",123)
  • 閉包返回值:閉包返回值 如果沒有定義return則直接返回最后一句話的返回值
println result //打印結果:return hei

5.2:閉包使用詳解

  • 5.2.1:與基本類型結合使用:
//upto:實現階乘
int x= fab_upTo(5)
println(x)
int fab_upTo(int number){
    int result = 1
    1.upto(number,{result*=it})
    return result
}
//downto:實現階乘
int x1= fab_downTo(5)
println(x1)
int fab_downTo(int number){
    int result = 1
    number.downto(1){result*=it}
    return result
}
//times:實現累加
int x2 = cal(101)
println(x2)

int cal(int number){
def result = 0;
number.times {
    result+=it
}
return result
}
  • 5.2.2:與String結合使用
String str = "the 2 and 3 is 5"
//each:遍歷查找,返回值是str自己
println str.each {temp ->
        print  temp.multiply(2)
}
//find查找一個符合條件的
println str.find {
        it.isNumber()
}
//findAll查找所有符合條件的,返回的是一個集合
println str.findAll {
        it.isNumber()
}
//any表示查找只要存在一個符合的就是true
println str.any { s ->
        s.isNumber()
}
//every表示全部元素都要符合的就是true
println str.every {
        it.isNumber()
}
//將所有字符進行轉化后,放到一個List中返回
def list = str.collect {
        it.toUpperCase()
}
println(list)
  • 5.2.3:與數據結構結合使用:

    這部分操作和與String結合使用類似,不再講解

  • 5.2.4:與文件結合使用

    這部分在講解到文件操作的時候,再進行具體講解

5.3:閉包進階詳解

  • 5.3.1:閉包關鍵變量:this,owner,delegate

情況1 :一般情況:

def scriptCloser = {
    println "scriptCloser:this:${this}"
    println "scriptCloser:owner:${owner}"
    println "scriptCloser:delegate:${delegate}"
}
調用:scriptCloser()
結果:
scriptCloser:this:variable.Closer@58a63629
scriptCloser:owner:variable.Closer@58a63629
scriptCloser:delegate:variable.Closer@58a63629

可以看到一般情況下:三種都是相等的:都代表當前閉包對象

情況2 :我們來看下面的情況:閉包中有閉包

def nestClosure = {
    def innerClosure = {
            println "innerClosure:this:"+this.getClass()
            println "innerClosure:owner:${owner.getClass()}"
            println "innerClosure:delegate:${delegate.getClass()}"
    }
    innerClosure()
}
nestClosure()
結果:
innerClosure:this:class variable.Closer
innerClosure:owner:class variable.Closer$_run_closure10
innerClosure:delegate:class variable.Closer$_run_closure10

看到在閉包中調用閉包:

this還是執(zhí)行外部的Closer對象,而ownerdelegate變?yōu)榱?code>Closer的內部閉包對象

情況3 :最后來看一種情況:使用delegate委托

class Student{
    def name
    def pretty = {println "my name is ${name}"}
    void showName(){
            pretty.call()
    }
}
class Teacher{
    def name
}
Student stu1 = new Student(name: 'yuhb')
Teacher tea1 = new Teacher(name: 'lily')

//改變委托delegate
stu1.pretty.delegate = tea1
stu1.showName()
//設置委托策略
stu1.pretty.resolveStrategy = Closure.DELEGATE_FIRST
stu1.showName()


結果:
my name is yuhb
my name is lily

通過上面三種情況:

總結出:

  • this:指向最外部的Closer對象
  • owner:執(zhí)行當前閉包的Closer對象,特指當前,所以對閉包中的閉包,指向內部的閉包
  • delegate:這個是閉包的代理對象,如果有單獨配置這個delegate,且設置了委托策略 =DELEGATE_FIRST, 則閉包中的所有內部屬性都會優(yōu)先使用delegate中的對象

下面我們就來講解閉包的委托策略

  • 5.3.2:閉包委托策略

閉包中給我提供了以下策略:

//優(yōu)先使用ower中的屬性
public static final int OWNER_FIRST = 0;
//優(yōu)先使用delegate中的屬性
public static final int DELEGATE_FIRST = 1;
//只是有owner中的屬性
public static final int OWNER_ONLY = 2;
//只是有delegate中的屬性
public static final int DELEGATE_ONLY = 3;
//使用this中的屬性
public static final int TO_SELF = 4;

通過5.3.1中的例子,我們也可以看出Groovy默認使用的是OWNER_FIRST的委托策略

6.文件

groovy文件操作完全兼容java的文件操作,但groovy集成了自己的高階使用方式

  • 讀文件:withReader
def file = new File('../../hello_groovy.iml')
def buf1 = file.withReader {reader ->
        char[] buf = new char[100]
        reader.read(buf)
        buf
}
println buf1
  • 寫文件:withWriter
//寫文件:withWriter:實現文件拷貝操作
def result = copy('../../hello_groovy1.iml','../../hello_groovy.iml')    
println result
def copy(String desFilePath,String srcFilePath){
try {
    File desFile = new File(desFilePath)
    if(!desFile.exists()){
        desFile.createNewFile()
    }
    File srcFile = new File(srcFilePath)
    if(!srcFile.exists()){
        return false
    }else{
        srcFile.withReader {reader ->
            def lines = reader.readLines()
            desFile.withWriter {writer ->
                    lines.each {line ->
                            writer.write(line+'\\r\\n')
                    }
            }
            return true
        }
    }
}catch(Exception e){
    return false
}

}
  • 讀對象:withObjectInputStream readObject

Groovy不僅可以寫文件,還可以寫入和讀取對象操作

//讀對象
def ob1 = readObject('../../person.bin')
println ob1
def readObject(String srcFilePath){
    try {
        File desFile = new File(srcFilePath)
        if(!desFile.exists()){
            return false
        }
        desFile.withObjectInputStream {
            def person = it.readObject()
            println person.name
        }
        return true
    }catch(Exception e){
            return false
    }
}
  • 寫對象:withObjectOutputStream writeObject
//寫對象:
Person person = new Person(name: 'uihb',age: 32)
saveObject(person,'../../person.bin')

def saveObject(Object obj,String desFilePath){
    try {
        File desFile = new File(desFilePath)
        if(!desFile.exists()){
            desFile.createNewFile()
        }
        if(obj != null){
            desFile.withObjectOutputStream {
                    it.writeObject(obj)
            }
        }
    }catch(Exception e){
            return false
    }
}

7.Json

  • 7.1:Object轉Json字符串轉
//1.ObjectJSon
def personList = [
        new Person(name: 'lily',age: 12),
        new Person(name: 'lucy',age: 14),
        new Person(name: 'kare',age: 18)
]

def jsonPerson =  JsonOutput.toJson(personList)
println JsonOutput.prettyPrint(jsonPerson)
  • 7.2:Json字符串轉Object
//2.JSon轉Object

def jsonSlurper = new JsonSlurper()
def obj = jsonSlurper.parseText(jsonPerson)
println(obj[0].name)

網絡獲取Json數據操作:

這里引入OkHttp

def getNetWork(String url){
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url(url)
            .get()
            .build();
    Call call = client.newCall(request)
    call.enqueue(new Callback() {
        @Override
        void onFailure(Request _request, IOException e) {

        }

        @Override
        void onResponse(Response response) throws IOException {
            def res = new String(response.body().bytes())
            println res
            JsonSlurper jsonSlurper1 = new JsonSlurper()
            Version objetres = (Version)jsonSlurper1.parseText(res)
            println  objetres.ecode
        }
    })
    sleep(10000)
}

class Version{
    int ecode
    String emsg
    CurrentVersion data
}
class CurrentVersion{
    String currentVersion
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2966

    瀏覽量

    104702
  • 開發(fā)
    +關注

    關注

    0

    文章

    370

    瀏覽量

    40836
  • gradle
    +關注

    關注

    0

    文章

    26

    瀏覽量

    708
收藏 人收藏

    評論

    相關推薦

    gradle的安裝和配置

    這幾種安裝方式。 2、準備工作 先別著急安裝,我們接著看官方文檔: 這句話的意思就是說,Gradle 安裝的系統(tǒng)是依賴JDK環(huán)境的,
    的頭像 發(fā)表于 09-25 17:11 ?2500次閱讀
    <b class='flag-5'>gradle</b>的安裝和配置

    gradle安裝與配置unity

    Gradle是一種用于構建和自動化構建過程的強大工具,而Unity則是一款跨平臺的游戲引擎。在Unity項目中使用Gradle可以幫助我們更方便地管理和構建項目,同時能夠提供更高的自定義能力和穩(wěn)定性
    的頭像 發(fā)表于 12-07 14:48 ?2136次閱讀

    Android Studio與Gradle深入

    ://jcenter.bintray.com/" }  下載不到特定的版本  Maven 和 Gradle 都會有一個緩存庫,默認安裝的情況下,是在用戶根目錄下的 .m2 或者 .gradle 文件夾中。 可以嘗試刪除里面
    發(fā)表于 08-31 17:58

    Gradle for Android

    Gradle for Android
    發(fā)表于 07-16 15:50

    快速入門Gradle的方法

    我們前面的Gradle是一門基于Groov的DSL,可能很多童鞋就是因為你是這個Gradle的迷,第一覺得Gradle是一門獨立的語言呀,如果想進入歧途了,我一開始也是這么迷糊的,當你了解之后,你就可以這么理解
    的頭像 發(fā)表于 04-08 10:56 ?1320次閱讀
    快速<b class='flag-5'>入門</b><b class='flag-5'>Gradle</b>的方法

    Gradle入門知識Gradle詳解

    大家回想一下自己第一次接觸`Gradle`是什么時候? 相信大家也都是和我一樣,在我們打開第一個AS項目的時候, 發(fā)現有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:47 ?2524次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>詳解

    Gradle入門知識Gradle詳解(下)

    大家回想一下自己第一次接觸`Gradle`是什么時候? 相信大家也都是和我一樣,在我們打開第一個AS項目的時候, 發(fā)現有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:51 ?856次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>詳解(下)

    Gradle入門知識Gradle語法1

    很多開發(fā)喜歡把`Gradle`簡單定義為一種構建工具,和`ant,maven`等作用類似, 誠然Gradle確實是用來做構建,但是如果簡單得把Gradle拿來做構建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?995次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b><b class='flag-5'>語法</b>1

    Gradle入門知識Gradle api解析(上)

    由于Project源碼篇幅太長:這里只列出類的部分方法和屬性: 我們前面分析過,每個build.gradle對應一個Project,Project在初始過程中會被構建為`樹`形結構:
    的頭像 發(fā)表于 03-30 11:01 ?2343次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b> api解析(上)

    Gradle入門知識Gradle語法3

    java中處理xml:使用的一般是dom文檔驅動處理或者sax事件驅動處理
    的頭像 發(fā)表于 03-30 11:04 ?747次閱讀

    Gradle入門知識Gradle api解析(下)

    由于Project源碼篇幅太長:這里只列出類的部分方法和屬性: 我們前面分析過,每個build.gradle對應一個Project,Project在初始過程中會被構建為`樹`形結構:
    的頭像 發(fā)表于 03-30 11:05 ?1061次閱讀

    Gradle自定義插件介紹2

    首先來講下`Gradle`和`Gradle插件`有啥區(qū)別? > `Gradle`是一套構建工具,其內部構建過程主要是以`Project`組成一個樹形的生態(tài)系統(tǒng),整個構建流程有自己的生命周期。每個Project又是由若干個T
    的頭像 發(fā)表于 03-30 11:17 ?886次閱讀
    <b class='flag-5'>Gradle</b>自定義插件介紹<b class='flag-5'>2</b>

    Gradle Plugin和AGP的區(qū)別1

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:48 ?1213次閱讀
    <b class='flag-5'>Gradle</b> Plugin和AGP的區(qū)別1

    Gradle Plugin和AGP的區(qū)別2

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:49 ?1160次閱讀

    Gradle Plugin和AGP的區(qū)別3

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:50 ?1250次閱讀
    RM新时代网站-首页