在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取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還是執行外部的Closer對象,而ownerdelegate變為了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:執行當前閉包的Closer對象,特指當前,所以對閉包中的閉包,指向內部的閉包
  • delegate:這個是閉包的代理對象,如果有單獨配置這個delegate,且設置了委托策略 =DELEGATE_FIRST, 則閉包中的所有內部屬性都會優先使用delegate中的對象

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

  • 5.3.2:閉包委托策略

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

//優先使用ower中的屬性
public static final int OWNER_FIRST = 0;
//優先使用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
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2972

    瀏覽量

    104867
  • 開發
    +關注

    關注

    0

    文章

    370

    瀏覽量

    40872
  • gradle
    +關注

    關注

    0

    文章

    26

    瀏覽量

    728
收藏 人收藏

    評論

    相關推薦

    gradle的安裝和配置

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

    gradle安裝與配置unity

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

    Android Studio與Gradle深入

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

    Gradle for Android

    Gradle for Android
    發表于 07-16 15:50

    快速入門Gradle的方法

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

    Gradle入門知識Gradle詳解

    大家回想一下自己第一次接觸`Gradle`是什么時候? 相信大家也都是和我一樣,在我們打開第一個AS項目的時候, 發現有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發表于 03-30 10:47 ?2539次閱讀
    <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項目的時候, 發現有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發表于 03-30 10:51 ?884次閱讀
    <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

    很多開發喜歡把`Gradle`簡單定義為一種構建工具,和`ant,maven`等作用類似, 誠然Gradle確實是用來做構建,但是如果簡單得把Gradle拿來做構建,就太小看Gradle
    的頭像 發表于 03-30 10:54 ?1017次閱讀
    <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在初始過程中會被構建為`樹`形結構:
    的頭像 發表于 03-30 11:01 ?2389次閱讀
    <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事件驅動處理
    的頭像 發表于 03-30 11:04 ?763次閱讀

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

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

    Gradle自定義插件介紹2

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

    Gradle Plugin和AGP的區別1

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

    Gradle Plugin和AGP的區別2

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

    Gradle Plugin和AGP的區別3

    Gradle Plugin`和`AGP`的區別? `Gradle Plugin`是`Gradle`構建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發表于 03-30 11:50 ?1270次閱讀
    主站蜘蛛池模板: 真爽~张开腿~让我插| 曰本性l交片视频视频| 国产亚洲片| 大又大又粗又爽又黄毛片女人| 成人国产精品2021| 黄色大片在线免费观看| 4438x成人免费| 国产在线精品一区免费香蕉| 怡红院黄色| 四虎影院永久在线观看| 日韩a无吗一区二区三区| 久久黄色视屏| 在线a人片免费观看不卡| 视频福利网| 五月丁香六月综合缴清无码| 性做久久久久久久| 一区二区三区伦理| 日本免费观看网站| 国产va免费精品| 日本黄页网站在线观看| 天天色色色| 8050午夜一级| 日本特级黄色大片| 国产免费久久精品| 日日干干| 欧美性极品xxxxx| 黄视频免费网站| 四虎在线免费视频| 激情文学综合丁香| 天天摸夜夜爽| 免费看黄色片网站| 尤物黄色| 免费观看四虎精品国产永久| 97av在线播放| 国产成人午夜片在线观看| 日韩欧美亚洲一区| 深爱激情婷婷| 国产婷婷色| 免费色片网站| 国产男女免费视频| 女性一级全黄生活片|