Gradle必須--Groovyベース

7253 ワード

GroovyはJVM仮想マシンに基づく動的言語であり、その文法はJavaと非常に似ており、JavaからGroovyにアクセスし、基本的に障害はありません.GroovyはJavaと完全に互換性があり、その上で多くのダイナミックタイプと柔軟な特性を追加しました.例えば、閉パッケージをサポートし、DSLをサポートし、非常に柔軟なダイナミックスクリプト言語と言えます.
Groovyの特性は多くありませんが、いくつかあります.私たちはここで全部話すことはできません.これもこの本の初心ではありません.ここで私はGradleに関する知識を選んで、みんなにすぐにGroovyに入門させます.そして、このスクリプト言語を理解して、Gradleで何を書いているのか知っています.次に、各GradleのbuildスクリプトファイルはGroovyスクリプトファイルで、クラスの定義、生命関数の定義、変数の定義など、Groovyに合ったコードを書くことができます.GroovyはJavaと完全に互換性があります.これは、buildスクリプトファイルにJavaコードを書くことができ、非常に柔軟で便利であることを意味します.
文字列
文字列は、どの言語にも文字列の処理があり、Javaは比較的複雑で、制限が多く、Groovyは文字列の演算、評価、正則など、非常に便利です.
これからはGroovyを正式に紹介しますが、その前にGroovyではセミコロンが必要ではないことを知っておく必要があります.Javaを使う多くの友达が慣れていると信じています.一行の終わりにはセミコロンが必要ですが、Groovyはこの強制規定ごとに、あなたが見たGradleスクリプトの多くはセミコロンがありません.実はこれはGroovyの特性で、Gradleの特性ではありません.セミコロンがない場合、私たちが読むときは1行もセミコロンがあるとデフォルトでなければいいです.
Groovyでは、一重引用符と二重引用符の両方で文字列定数(Javaでは一重引用符で文字を定義)を定義できますが、一重引用符では文字列内の式を演算するのではなく、純粋な文字列定数をマークします.
task printStringClass << {
    defstr1 = '   '
    defstr2 = "   "
    println"           :"+str1.getClass().name
    println"           :"+str2.getClass().name
}
./gradlew printStringClassが実行されると、出力が表示されます.
           :java.lang.String
           :java.lang.String

一重引用符で定義しても二重引用符で定義してもStringタイプです.先ほど、文字列内の式を単一引用符では演算できないことを説明しましたが、例を見てみましょう.
task printStringVar << {
    defname = "  "
    println'        :${name}'
    println"        :${name}"}
./gradlew printStringVar運転後出力:
        :${name}        :  

二重引用符マークは私たちが望んでいる結果を出力しているが、一重引用符はないので、一重引用符には演算能力がなく、その中のすべてが定数文字列であることを覚えておくことができます.
二重引用符は式計算を直接行うことができるこの能力は非常に使いやすく、Javaの煩雑な+番号を使わずに文字列リンク演算を行うことができます.このネストされたルールを覚えておいてください.1ドルの記号が1対のカッコに続いています.カッコには式が入っています.例えば、${name}${1+1}などです.変数が1つしかない場合は、$nameなどのカッコを省略することができます.
しゅうごう
集合は、Javaでよく使われるもので、GroovyはJavaの集合と完全に互換性があり、生命の集合、集合の反復、集合の要素の検索などの操作が非常に容易になるように拡張されています.一般的な集合はListSetMap、およびQueueであり、ここでは一般的なListおよびMapのみを紹介する.
List
Javaでは,リストを定義するには,リストインタフェースを実現したクラスをNewする必要があり,煩雑でGroovyでは非常に簡単である.
task printList << { 
    def numList =[1,2,3,4,5,6];
    println numList.getClass().name
}

出力によりnumListがArrayListタイプであることがわかる.
集合を定義しました.どのようにしてその中の要素にアクセスしますか.Javaのようにgetメソッドを使用しますか.あまりにもLowで、Groovyは非常に簡単な方法を提供しています.
task printList << { 
    def numList =[1,2,3,4,5,6];
    println numList.getClass().name
    println numList[1]//       
    println numList[-1]//        
    println numList[-2]//         
    println numList[1..3]//           
}

Groovyは、配列のように下付きインデックスにアクセスします.また、負の下付きインデックスと範囲インデックスも提供します.負のインデックスは右から数え、-1は右から数えた最初のインデックス、-2は右から数えた2番目のインデックスを表します.1...3これは範囲インデックスで、真ん中に2つ使います.分けて、これはよく遭遇します.
アクセスの便利さに加えて、Groovyはリストに非常に便利な反復操作を提供し、これがeach方法であり、この方法はリスト内の各要素にアクセスできる閉パケットをパラメータとして受け入れる.
task printList << {
    def numList =[1,2,3,4,5,6];
    println numList.getClass().name

    println numList[1]//       
    println numList[-1]//        
    println numList[-2]//         
    println numList[1..3]//f           

    numList.each {
        println it
    }
}

it変数は反復中の要素であり、ここには閉パッケージの知識があります.私たちはまずこのように覚えておくことができます.後で詳しく話します.
Map
MapはListに似ていますが、その値はK:Vキー値ペアなのでGroovyではMapの定義も簡単です.
task printlnMap << { 
    def map1 =['width':1024,'height':768]
    println map1.getClass().name
}

アクセスも非常に柔軟で容易で、map[key]やmap.keyの方式でも可能です.
task printlnMap << {  
    def map1 =['width':1024,'height':768]
    println map1.getClass().name

    println map1['width']
    println map1.height
}

どちらも指定したkeyの値をすばやく取り出すことができますが、どうでしょう.Javaよりずっと便利でしょう.
Mapの反復についてはもちろんeachメソッドも欠かせないが,反復される要素はMap.Entryのインスタンスである.
task printlnMap << {
    def map1 =['width':1024,'height':768]
    println map1.getClass().name

    println map1['width']
    println map1.height

    map1.each {
        println "Key:${it.key},Value:${it.value}"
    }
}

集合については、collect、find、findAllなどの便利な方法も提供されています.興味のある方は関連ドキュメントを探してみてください.ここでは一つ一つ説明しません.
方法
方法はみんなよく知られていません.ここで特に一節で話した目的は主にGroovy方法とJavaの違いを話して、それから私たちは私たちのGradleスクリプトの中のコードを見ることができて、突然発見して、もとはこれは1つの方法の呼び出しです!
かっこは省略できます
私たちがJavaで呼び出す方法はすべてinvokeMethod(parm 1,parm 2)で、とても規範的で、Javaはこのような規則的な言語で、Groovyの中で柔軟に多くて、省略()することができてこのようなinvokeMethod parm 1になって、parm 2はとても簡潔だと思っていますか?これはDSLを定義する時とても役に立ち、書くのもとても便利です.
task invokeMethod << {
    method1(1,2)
    method1 1,2

}
def method1(int a,int b){
    println a+b
}

前例の2つの呼び出し方式の結果は同じで、2つ目がもっと簡潔だと思っているかどうかは、Gradleのメソッド呼び出しはこのような書き方です.
returnは書かなくてもいいです
Groovyでは、戻り値のあるメソッドを定義する場合、return文は必須ではありません.returnがない場合、Groovyはメソッド実行中の最後の文コードを戻り値とします.
task printMethodReturn << {
    def add1 = method2 1,2
    def add2 = method2 5,3
    println "add1:${add1},add2:${add2}"

}
def method2(int a,int b){
   if(a>b){
        a
    }else{
        b
    }
}
```groovy
  `./gradlew printMethodReturn`       :

```bash
add1:2,add2:5

例から、aが最後の行として実行されるコードである場合、aはその方法の戻り値であり、逆にbであることがわかる.
コードブロックはパラメータとして渡すことができる
コードブロック-カッコで囲まれたコードのセグメントは、実際には私たちの後にする閉パケットであり、Groovyはパラメータとして伝達することを許可していますが、この私たちの上の方法の特性と結びつけて、最後の閉パケットベースの方法呼び出しは非常に優雅で、読みやすいです.我々の集合のeach法を例にとると,受け入れられるパラメータは実は閉パケットである.
//            
numList.each({println it})
//       ,       
numList.each({
    println it
})
//    ,Groovy  ,              ,        
numList.each(){
    println it
}
//        ,           
numList.each {
    println it
}

この進化方式を理解して、あなたは更に類似のこのような書き方を見て理解して、もとは1つの方法の呼び出しで、このように押して、あなたもどのように1つの方法を定義して、他の人にこのように呼び出すことを知っています.
JavaBean
JavaBeanは非常に良い概念で、あなたが今見ているコンポーネント化、プラグイン化、構成統合などはJavaBeanに基づいています.JavaではJavaBeanのプロパティにアクセスして変更するためにgetter/setterメソッドの生成を繰り返し、それらを使用する必要があります.面倒で煩雑で、Groovyでは大きな改善が得られています.
task helloJavaBean << {
    Person p = new Person()

    println "   :${p.name}"
    p.name = "  "
    println "   :${p.name}"
}
class Person {
    private String name
}

name属性に値を付けていない場合、出力はnullであり、値を付けた後、出力は「張三」であり、上記の例を通して、getter/setterメソッドを借りずにGroovyでJavaBeanの属性値にアクセスし、修正することが非常に容易であることが分かった.これはGroovyが私たちを助けてくれたからだ.
Groovyでは、クラスのプロパティとしてアクセスするには、メンバー変数を定義する必要はありません.getter/setterメソッドを直接getter/setterメソッドとしても、プロパティとしてアクセスできます.
task helloJavaBean << {
    Person p = new Person()

    println "   :${p.name}"
    p.name = "  "
    println "   :${p.name}"
    println "   :${p.age}"}
class Person {
    private String name
    public int getAge(){ 
           12
    }
}

上記の例では、ageのメンバー変数を定義していませんが、getAge()メソッドを定義したため、p.ageでこの値を取得することができます.では、このときageの値を変更できますか?答えはできません.setterメソッドを定義していないからです.
Gradleではこのような書き方がたくさん見られますが、これはオブジェクトの属性の一つだと思っていましたが、実際にはオブジェクトに対応するgetter/setterメソッドが定義されているからです.