Groovy3 リリース 変更点を紹介

Groovy3 がリリース!

Groovy3が先月末にとうとうリリースされました。
ベータやRC版は去年からありましが、ようやっと正式リリースがされました。

この記事では、Groovy3の主な変更点を簡単に記載しています。

Groovy 日本ではあまり人気ない?

個人的に思うのは、
日本ではGroovyに関しての日本語の記事が少ない印象です。
結構、利用はされていると思うのですが、それにしては少ないですよね。

それに、苦手意識を持っている人も多いんじゃないでしょうか。
特にGroovyにはDSLがある為に、build.gradle (Gradle) を見たときに、
プログラム言語なのか、設定ファイルなのかよくわからない見た目から、
どこをどういじっていいかわからない・・。
Groovyがよくわからん言語だと思った人も多いと思います。

自分も最初に見たとき、こんなの触りたくないと思いました。笑

Groovyは使いやすい

ただ、DSLを抜きにして、Groovy言語自体の書き方を勉強すると。
Groovy言語自体は、とてもわかりやすい言語です。
Javaがわかる人には、もちろんの事。
スクリプト言語のように振る舞うので、とっかかりやすいです。

自分は、PHP, Ruby, Python なども触ってきましたが、
一番、直感的に書ける言語だと思っています。

Groovyはコンパイルすると、Java同様に、
成果物として、Classファイル、Jarファイルが出力されます。
JVM上で動作させることができるので、
Java同様にJVMがあれば安定して動作させる事ができます。

配布する際には、
JVMとJarファイルさえあれば動作させることができます。

Groovy3の主な変更点

Groovy3がリリースされたので、主な変更点を紹介します。

Parrotパーサー

Parrotパーサーという新しいパーサーが使われるようになりました。
私も詳しくは理解してませんが、
Groovyコードを解析する為のパーサー、という事だと思います。

Groovy3は、新しいパーサーに差し替わったことで、
パフォーマンス改善、メンテナンスのしやすさを実現しているようです。

ラムダ式がそのままかけるように

Java8 から追加されたラムダ式ですが、
Groovy では、クロージャというもので代用していました。

Groovyは、Javaにラムダ式がないときから、
クロージャという言語仕様を用意して
同じ事を実現していたのです。

クロージャの書き方 { o -> ... }
ラムダ式の書き方 o -> { ... }

引数を、波括弧の外に書くか、中に書くかの違いですが、
これが、Groovy3からは、どちらでもOKになりました。

def ret = list.stream()
        .filter(o -> o.isActive())
        .map(o -> o.name())
        .toList()

メソッド参照

メソッド参照も、GroovyではJavaと同様に書くことができませんでした。
Groovy3からは、同じようにメソッド参照を書けるようになりました。

def ret = list.stream()
        .filter(Shop::isActive())
        .map(Shop::name())
        .toList()

エルビス代入

Elvis assignment operator というもの。
エルビス演算と似た感じで、代入式にも利用できるようになりました。

hoge ?= 100 

上記の例では、hoge変数がnullであれば、100が代入されます。

instanceof, in の否定 

!instanceof と、!in という演算子が利用できるようになりました。

それぞれ、instanceofと、inの否定判定になります。
否定する場合は、括弧で囲う必要があったのですが、
直接!をつけることで、表現できるようになりました。

int i = 99
if (i !instanceof String){
    // Stringインスタンスじゃないなら
    ...
}
int i = 2
if (i !in [1, 3, 5, 7]){
    // 含まれていなかったら 
    ...
}

do-while ループ

do-while文が新たに使えるようになりました。
while文自体はもともとJavaでも、Groovyでもありましたが、

今回、do-while文が追加されています。

do {
    ...
} while (...)

for-loop の強化

forループで、カンマで区切れば、
複数の変数を初期化、ステップ処理できるようになりました。

C/C++のfor文と同じものですね。

for (int i = 1, j = 2; i <= 10; i++, j += 2) {
    ...
}

配列の初期化

Javaの配列初期化、
実はGroovyでは同じようにかけなかったのです。
書き換えが面倒で、地味に苦労していたので、これは嬉しいです!

def arrInt = new int[] {1, 2, 3}
def arrStr = new String[] {'hoge', 'piyo'}

もちろん、Groovyのもともとの書き方も引き続きサポートされています。

def arr = [1,2,3]

try-with-resources

Automatic Resource Management (ARM) という、
Java7から追加されている、try-with-resources というものです。

スコープを抜けた際に、
Closeメソッドを自動でコールしてくれるというものですね。

Groovyでは、
withCloseable というメソッドが用意されていたので、同じ事はできていましたが、
Javaコードと同じ書き方でも動作するようになりました。

try (def rs = stmt.executeQuery(sql)) {
    ...
    // スコープを抜ける際に、自動でCloseされる。
}

あとがき

Gradleの組み込みGroovy

Groovy3は2月末にリリースされたところで、
まだGradleの組み込みGroovyには反映されていません。
どのくらいで、組み込まれるのかは不明。

Gradle 6.3 RC1 のバージョンでも、
組み込みGroovyは、2.5.10のようです。

JavaコードがそのままGroovyスクリプトに

Java7,8 がリリースされてから、
Groovyが本来うたっていた、JavaコードがそのままGroovyコードとして動く、
という魅力が失われていました。

しかし、今回 Groovy3リリースによって、
ラムダ式やメソッド参照などの Java7,8 以降のコードを、
そのまま Groovyスクリプトとして動かせるようになったのは嬉しいですね。

コメントを残す