1. ホーム
  2. groovy

Groovyの紹介と使い方

2022-02-22 05:34:21
<パス

この記事はJane's Bookに掲載されたものです。 https://www.jianshu.com/p/2c6b95097b2c

紹介文

グルーヴィー は、Python、Ruby、Smalltalkの強力な機能の多くを組み合わせた、JVM上に構築された軽量かつ強力な動的言語です。

GroovyはJavaで書かれており、Groovyの文法はJavaの文法に似ています。GroovyのコードはJavaのコードとうまく動作し、既存のコードの拡張に使用できます。

使用方法

SDKのダウンロード

  • Groovyコンソール
  • IDEA groovyプラグインのインストール

アプリケーション

ElasticSearch、JenkinsともにGroovyスクリプトの実行をサポートしています。
プロジェクトビルドツールGradleはGroovyの実装です。


Groovyの構文の特徴(Javaとの比較)

  1. セミコロン不要

  2. return キーワードを省略し、メソッドの最後の式を戻り値として返すこともできます(可読性を低下させないために適宜使用します)。

  3. クラスのデフォルトのスコープは public ゲッター/セッターメソッドは必要ありません。

  4. def キーワードで定義された変数はすべてObject型で、任意の変数、メソッドを使用することができます。 def の定義/宣言で、Groovyでは「すべてはオブジェクトである」とされています。

  5. ナビゲーション演算子 ( ?. ) は、オブジェクト参照が空でないときにのみ呼び出されるメソッドを実装するのに役立ちます。

    // java
    if (object ! = null) {
        object.getFieldA();
    }
    // groovy
    object?.getFieldA()
    
    
    
  6. コマンド・チェイニングでは、Groovyではトップレベルのメソッド呼び出しにおいて、引数の周りの括弧を省略することができます。コマンドチェイニング機能は、この機能を拡張し、括弧を必要としないメソッド呼び出しを、引数の周りの括弧や、リンクされた呼び出し間のドットなしでチェイニングします。

    def methodA(String name) {
        println("A: " + name)
        return this
    }
    def methodB(String name) {
        println("B: " + name)
        return this
    }
    def methodC() {
        println("C")
        return this
    }
    def methodD(String name) {
        println("D: " + name)
        return this
    }
    
    methodA("xiaoming")
    methodB("zhangsan")
    methodC()
    methodD("lisi")
    
    // brackets are needed in chains without parameters 
    methodA "xiaoming" methodB "zhangsan" methodC() methodD "lisi"
    
    
    
  7. クロージャ。クロージャは匿名の短いコードブロックです。それぞれのクロージャは groovy.lang.Closure クラスを継承したクラスにコンパイルされ、引数を渡してクロージャを呼び出す call というメソッドを持っています。

    def hello = {println "Hello World"}
    hello.call()
    
    // Include formal parameters
    def hi = {
        person1, person2 -> println "hi " + person1 + ", "+ person2
    }
    hi.call("xiaoming", "xiaoli")
    
    // implicit single argument, 'it' is a keyword in Groovy
    def hh = {
        println("haha, " + it)
    }
    hh.call("zhangsan")
    
    
    
  8. シンタックスで、(クロージャの実装)

    // Java
    public class JavaDeamo {
        public static void main(String[] args) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.MONTH, Calendar.DECEMBER);
            calendar.set(Calendar.DATE, 4);
            calendar.set(Calendar.YEAR, 2018);
            Date time = calendar.getTime();
            System.out.println(time);
        }
    }
    // Groovy
    Calendar calendar = Calendar.getInstance()
    calendar.with {
        // it refers to the calendar reference
        it.set(Calendar.MONTH, Calendar.DECEMBER)
        // you can omit it and use the command chain
        set Calendar.DATE, 4
        set Calendar.YEAR, 2018
        // calendar.getTime()
        println(getTime())
        // omit get, for method names that start with get and
        println(time)
    }
    
    
    
  9. データ構造のネイティブな構文で、より簡単に記述可能

    def list = [11, 12, 13, 14] // list, default is ArrayList
    def list = ['Angular', 'Groovy', 'Java'] as List // list of strings
    // same as list.add(8)
    list << 8
    
    [1, 2, [3, 4], 5] // Nested lists
    ['Groovy', 21, 2.11] // A heterogeneous list of object references
    [] // an empty list
    
    def set = ["22", "11", "22"] as Set // LinkedHashSet, as operator-converted type
    
    def map = ['TopicName': 'Lists', 'TopicName': 'Maps'] // map, LinkedHashMap
    [:] // empty map
    
    // loop
    map.each {
        print it.key
    }
    
    
    
  10. グルーヴィー・トゥルース

のように、すべての型をブール値に変換することができます。 null , void オブジェクトは、0 または null 値に相当し、次のように解決されます。 false と同等であり、その他は

true

  1. Groovyサポート DSL (Domain Specific Languages) DSLはGroovyで書かれたコードを単純化し、一般ユーザが理解しやすいように設計されています。

    コマンドチェーンでDSLを書く

    // groovy code
    show = { println it }
    square_root = { Math.sqrt(it) }
    
    def please(action) {
      [the: { what ->
        [of: { n -> action(what(n)) }]
      }]
    }
    
    // DSL language: please show the square_root of 100 (please show the square root of 100)
    
    // call, equivalent to: please(show).the(square_root).of(100)
    please show the square_root of 100
    // ==> 10.0
    
    
    
    
  2. ジャワの == は、実はGroovyの is() というメソッドがありますが、Groovy の == は、より巧妙な equals() . Groovy でオブジェクトへの参照を比較するために == を使用するのではなく

    a.is(b)
    


を使用したJavaプロジェクトでのGroovyの統合

プロジェクトにgroovyの依存関係を導入する

org.codehaus.groovy
                
groovy-all
                
x.y.z
            

groovy.lang.Script