Groovy シリーズ 1 Groovy の基本文法

目次

Groovyを学ぶ理由

Groovy の概要

魅力的な機能

グルーヴィーなアクション

ダイナミックタイプ

シンプルでわかりやすいリスト、マップタイプ

グルーヴィーな世界のすべてはオブジェクトです

属性の操作がさらに簡単になりました

G文字列

閉鎖

代表者: 代表者

スイッチがさらにシンプルに

メタプログラミング

必須の型チェック

エルヴィスのオペレーター

安全なアクセス


Groovyを学ぶ理由

        Java ベースのプログラマである Groovy には、Java プラットフォーム上のスクリプト言語 (動的言語) としての互換性という独自の利点があります。Aandroid 開発に触れたことのある学生は、すでに Gradle 構築プロジェクトに触れています (Gradle 構築は Java プロジェクトの構築もサポートしています) Gradle は、Groovy を使用して実装されたプロジェクトを構築するためのフレームワークです。さらに、idea の新しいバージョンでは、プラグイン開発に Gradle を使用することを推奨しています。もちろん、上記は、Groovy テクノロジ (これらの側面を含むがこれらに限定されない) の開発傾向を客観的に説明したものであり、私たちが自分のレベルから、より多くのことを学び、より多くの利益を得る必要があること、または技術的な知識を持った学生が学ぶ必要があることを示しています。追求や技術的な理想については、詳細をご覧ください。 ドア技術は自分自身の向上でもあります。次は一緒にGroovyの世界へ足を踏み入れましょう。

Groovy の概要

        Apache Groovy は、Java プラットフォーム用の静的型付けと静的コンパイルを備えた、オプションで型付けできる強力な動的言語であり、簡潔で使い慣れた、学びやすい構文を通じて開発者の生産性を向上させるように設計されています。あらゆる Java プログラムとスムーズに統合し、スクリプト機能、ドメイン固有の言語オーサリング、ランタイムおよびコンパイル時のメタプログラミング、関数型プログラミングなどの強力な機能をアプリケーションに即座に提供します。

                                                                                                                           -- groovy 公式サイト

        上記は公式サイトの紹介文ですが、私の個人的な理解としては、 Groovy は Java 仮想マシン用のアジャイルな動的言語であり、成熟したオブジェクト指向プログラミング言語であり、純粋なスクリプト言語です。Groovy は JVM 環境上で動作し、構文に Java 言語とスクリプト言語の両方の特性を備えているため、構文が大幅に簡素化されます。同時に、動的言語のクロージャなどの機能も備えており、純粋な Java コードにはないダイナミズムを補っており、再公開することなくプログラムの実行中にコードのロジックを任意に変更できます。

        Groovy 1.0 は 2007 年 1 月 2 日にリリースされました。Groovy は、Apache License v 2.0 に基づいてリリースされています。Groovy の公式サイトはApache Groovy プログラミング言語です

魅力的な機能

        Groovy には次の機能があります (公式 Web サイトの API ドキュメント: Apache Groovy プログラミング言語 - Groovy Development Kit )。

  1. Groovy は Java 仮想マシンに基づくオブジェクト指向スクリプト言語であり、静的型付けと動的型付けの両方をサポートします。
  2. Java と Groovy の構文は非常に似ており、既存の Java ライブラリを使用できるため、Groovy は Java 開発者にとって簡単です。
  3. 演算子のオーバーロードがサポートされています。
  4. ネイティブ構文リストと連想配列。
  5. 正規表現のネイティブサポート。
  6. XMLやHTMLなどのさまざまなマークアップ言語がネイティブにサポートされています。
  7. Groovy は java.lang.Object を拡張します。

グルーヴィーなアクション

ダイナミックタイプ

        groovy の最初の機能は動的機能です。変数を定義した後、その変数に任意の型の値を割り当てることができます。groovy はこのサポート方法を提供しますが、コーディングの習慣を良くするために、この開発方法は終了する予定です。

def v = 0;//定义了数值类型的变量v 
v = new Date();//然后又给它赋与Date类型的值. 
println(v);

シンプルでわかりやすいリスト、マップタイプ

        Groovy を使用すると、リストとマップのデータ構造を簡単かつ明確に定義できます。値を割り当てる前に型を定義する必要がある Java China とは異なり、Groovy は糖衣構文を直接使用して値をすばやく割り当てることができます。詳細については、次のコード例を参照してください。概念を説明するために代表的な API のみがリストされています。残りの API に興味がある場合は、自分で試して練習することができます。

  • リスト list を定義し、それを直接操作するには、「[]」を使用します。
// list 可以看到的是编译器帮我们作何类型识别
def list = [1, 2]
// 这个是groovy的list的API从左边插入一个记录
list.leftShift(3)
// push是从插入到列表前面
list.push(0)
// add和我们java的List一样是追加到最后
list.add("abc")
// groovy中的<<可以对list数据类型的作用添加值,也是追加到最后面,需要注意的是在数字类型时是位运算操作
list << "<<号";
// "+"在groovy的语法中也是追加元素到集合中,并且是追加到最后
list += "加上+="

// 查看打印结果可以看到我在每个API的功能描述上的说明
// [0, 1, 2, 3, abc, <<号, 加上+=]
println(list)

// 也可以采用 lambda 表达式遍历集合
list.forEach({ println(it)})
  • 「:」を使用してキーと値を区切ってマップ データを定義します。キーを引用符で囲む必要はなく、キーを使用してマップを直接読み書きできます。
def map = [a: 2, b: new Date()];

// 写入 直接追加到map集合中
map.put("aaaa","bbb")

println(map)
// 写入 直接采用Map的key进行操作
map.a = "a value change"

println(map)

// 结果如下 可以看到 key 为 "a" 的value被改变
[a:2, b:Sun May 28 11:19:56 CST 2023, aaaa:bbb]
[a:a value change, b:Sun May 28 11:19:56 CST 2023, aaaa:bbb]

グルーヴィーな世界のすべてはオブジェクトです

        上記の概念をどのように理解すればよいでしょうか? Java 言語と比較すると、Java 言語では基本型と参照型が異なる方法で扱われることは誰もが知っています。プリミティブ型は値によってアクセスされるため、プリミティブ型にはメソッド呼び出しがありません。この点では、Groovy は Java よりもオブジェクト指向言語に近いです。

// 在groovy中,一切都是对象。一切都可以当成对象来使用;
// 即使在Java中的基本类型也更像是一个对象
100.times {println("hello world")}

属性の操作がさらに簡単になりました

        Java とは異なり、オブジェクトのプロパティを操作するには、プロパティがプライベートとして定義されている場合でも、get メソッドと set メソッドを使用する必要があります。Groovy では、Javabean を定義するために、getter メソッドと setter メソッドを記述する必要がなくなりました。「.」を直接使用して、読み取りおよび書き込み属性を操作できます。

class JavaBeans {
    String a
    // 即使是定义成private 也可以直接访问
    //    private String a
}

def beans = new JavaBeans();

beans.a = "object set property value"

println(beans.a)

G文字列

        GString は、文字列を高速に処理するために Groovy によって提供されるツールです。二重引用符 "" で囲まれた文字列は、$var または ${var} を介して簡単かつ明確な方法で変数を直接埋め込むことができます。そして、GStrng はそれを含むクロージャを呼び出し、パラメータのない GString はクロージャを呼び出し、期待される結果を Writer に出力します。

// case1
def a = "a"
def b = "b"
// a=a,b=b 快速替换字符串变量
println("a=${a},b=$b")

// case2
def name = 'lly'
def hello = "hello $name !"
// 结果:hello lly ! 快速替换字符串变量
println hello
// 注意这一行
name = '阳仔'
// 结果:hello lly !
println hello

// case3 :GStrng会调用包含的闭包 无参GString会调用闭包并打印我们期待的结果到Writer
def quote = "${-> name} , welcome"
// 结果:阳仔 , welcome
println quote
// 注意这一行
name = 'lisi'
// 结果:lisi , welcome
println quote

閉鎖

        groovy のクロージャは、パラメータや戻り値を持たないコード ブロックとみなすことができます。これは、java8 上のラムダ構文のようなもの、または 1 つのメソッドを持つ Java の内部クラスのようなものです (ここでは、関数型プログラミングの仕様定義に似ています)。Groovy クロージャの暗黙的な組み込み変数。この変数を通じて、個々の要素の操作を取得することができます。イテレーション、ジャッジメント、その他のビジネスなど。

it: クロージャ メソッドでパラメータが定義されていない場合は、it 変数を直接使用することもできます。

this: Java の this と同じです。

owner: 基本的にこれと同じですが、あるケースでは、クロージャが別のクロージャで定義されている場合、オーナーはそれを定義するクロージャ オブジェクトを指します。

// 闭包中内置了很多迭代方法,如find、findAll、collect等等。这里需要注意的是内置对象 it 的使用
def list = ['foo', 'bar']
def newList = []
list.collect(newList) {
    it.toUpperCase()
}
// 结果:[FOO, BAR]
println newList

//或者
list = ['foo', 'bar']
newList = []
list.collect(newList, {
    it.toUpperCase()
});
// 结果:[FOO, BAR]
println newList


// 在groovy闭包中的隐含内置变量

def a = {
    println "a this:" + this
    println "a owner:" + owner // ower指向b

    def b = {
        println "b this:" + this
        println "b owner:" + owner // ower指向b
    }
    b.call()

}
a.call()

// 结果:这里可以看到 this 和 owner 异同
a this:script.GroovyDemo1@78b236a0
a owner:script.GroovyDemo1@78b236a0
b this:script.GroovyDemo1@78b236a0
b owner:script.GroovyDemo1$_run_closure3@304b9f1a

代表者: 代表者

        Groovy のデリゲートは基本的にオーナーと同じですが、Closure.setDelegate() を介して新しいオブジェクトに委任する点が異なります。

def scriptClosure = {
    println "scriptClosure this:" + this
    println "scriptClosure owner:" + owner
    println "scriptClosure delegate:" + delegate
}
println "before setDelegate()"
scriptClosure.call()
scriptClosure.setDelegate("lly")
println "after setDelegate()"
scriptClosure.call()

// 结果:
scriptClosure this:script.GroovyDemo1@5c371e13
scriptClosure owner:script.GroovyDemo1@5c371e13
scriptClosure delegate:script.GroovyDemo1@5c371e13
after setDelegate()
scriptClosure this:script.GroovyDemo1@5c371e13
scriptClosure owner:script.GroovyDemo1@5c371e13
scriptClosure delegate:lly

スイッチがさらにシンプルに

        Groovy のスイッチを使用すると、リスト、オブジェクト、範囲などの式をケース ベースとして使用できるようになります。

def x = 20;
switch (x) {
    case [1, 2, 3, 4, 5]:
        println("aaaaaa")
        break;
    case "foo":
        println("bbbbb")
    case 10..1000:
        println("ccccc")
        break;
    case Date:
        println("dddddd")
        break;
}

// 结果: 因为 20 在 10到1000 的范围内
ccccc

メタプログラミング

        Groovy では、metaClass クラスを使用して、メタ オブジェクトにプロパティとメソッドを追加できます。その理由は、Groovy では、オブジェクトが定義されていないメソッドを使用している場合、エラーは報告されず、少なくともコンパイル時にエラーは報告されないためです。これは、Groovy の特別なランタイム メカニズムによるものです。オブジェクトのメソッドを呼び出すと、まずそのプロパティとメソッドがクラスに定義されているかどうかがチェックされます。Java ではすべてのクラスが Object を統合しますが、Groovy ではすべてのクラスが GroovyObject を継承し、このクラスには MeteClass を取得するメソッドがあります。このようにして、静的メソッドも含めて、操作中にオブジェクトにプロパティとメソッドを動的に追加できます。MeteClassにこのメソッドが定義されていない場合は、エンティティクラスにmethodMissingメソッドとinvokeMethodメソッドが順番に実装されているかどうかを調べる必要があり、これら2つのメソッドで特別な処理を行うことができます。

// 基本元编程
// 对String类,添加一个uppers方法
String.metaClass.uppers = { -> toUpperCase() };
println "aaa".uppers()
//结果:AAA

// 对Interger类,添加一个say方法
Integer.metaClass.say = { -> "I am Interger" }
def i = new Integer(100);
println i.say()
// 结果:I am Interger

// 给对象添加属性、方法、静态方法
class Person {
    String name;
    Integer age;

    String eat() {
        println(name + "like eat")
    }
}
def p = new Person(name: "阳仔", age: 18)
p.eat()

// 给对象添加属性
p.metaClass.sex = '男'
// 给对象添加方法
p.metaClass.drink = {
    -> println "喜欢喝饮料"
}
// 给对象添加静态方法
p.metaClass.static.play = {
    -> println "喜欢玩游戏"
}

println "${p.name},今年${p.age}岁了,性別是${p.sex}"
p.drink()
p.play()

// 结果
阳仔like eat
阳仔,今年18岁了,性別是男
喜欢喝饮料
喜欢玩游戏

必須の型チェック

        前回の学習プロセスで、Groovy は型チェックが弱いことがわかりました。変数であってもコレクションであっても、あらゆる型のデータを受け取ることができます。シナリオによっては特定の型を制限したい場合は、@ を使用する必要があります。 TypeChecked アノテーション 型チェックを強制的に楽しんでください。クロージャでは、強力な型チェックが必要な場合、Java 構文のようにパラメータの型を定義できます。

class Foos{
    int  i = 42.0; //编译通过
}

@TypeChecked
class Foo{
    int  i = 42.0; //编译不通过
}

//在闭包中,如果需要强类型检查,可以像java语法一样定义参数类型
def list = ["a","b","c"]
// 编译不通过
//def list = ["a","b","c", 1]
list.collect {
    String it -> it.toUpperCase()
}
println(list)

エルヴィスのオペレーター

        Groovy は、三項演算子をさらに簡素化するために Elvis 演算子演算を採用しています。

def a = null;
// 在定义b变量时,先判断a是否有值,如果有,就取a的值作为b的值,否则就取值"b"
def b = a ?: "b"; 
println(b)

安全なアクセス

        これは Java の空の判定と同じですが、より簡潔です。

def person;
//先判断person是否为不为null,然后,再调用getName方法
String name = person?.getName();
println(name)

おすすめ

転載: blog.csdn.net/lly576403061/article/details/130913526
おすすめ