saba1024のブログ

どうでも良い思いついた事とかプログラミング関係のメモとか書いていきます。

Apache Groovy 2.6でJava8の文法が使える!

表題の通りなのですが、ParrotブランチでGroovy3を垣間見るで示されている内容が、Groovy2.6(2017/09/06時点ではalpha-1)の時点で利用できるようになりまりた。
ざっくりというと、Java8の新構文(lambdaとか)や、Java7で導入されたtry-with-resourcesが利用できるようになったりなど、Groovyがより一層Javaとの親和性を高める内容になっています。

まだアルファ版なので今後変化する可能性が有りますが、具体的に何が変るのかに関しては、上記の記事や、公式のRelease notes for Groovy 2.6に網羅されています。

現在ベータ版が提供されているGroovy2.5ではまだ新パーサは提供されていないのでこの内容は該当しません。
Groovy2.6からは、オプションとして-Dgroovy.antlr4=trueを指定してGroovyを利用することで、Java8のlambda文などがそのまま利用できるようになります。
そして、Groovy3からはデフォルトでこのオプションがオンにる予定です。

実際にSDKMANで、2.6-alpha1を試してみました。
なお、GroovyConsoleを使いたかったので、-Dgroovy.antlr4=trueJAVA_OPTSに格納しています。

# 先ずはインストール
[koji:~]$ sdk install groovy 2.6.0.alpha-1
[koji:~]$ sdk use groovy 2.6.0-alpha-1

# JAVA_OPTSに今回のオプションを追加する
[koji:~]$ echo $JAVA_OPTS

[koji:~]$ export JAVA_OPTS="-Dgroovy.antlr4=true"
[koji:~]$ echo $JAVA_OPTS                        
-Dgroovy.antlr4=true
[koji:~]$ 
[koji:~]$ groovyConsole&

以下のように、lambda式がそのまま使えます!

def primes = [1,2,3,4,5]
Collections.sort(primes, (a, b) -> { return b - a; });
assert primes == [5,4,3,2,1]

これで再びGroovyがJavaとほぼ同等、と胸を張って言えるようになります。
が、Java9の登場と今後のJava言語のロードマップが示されたことで、今後はGroovyに限らずJVM上で動いてる各種JVM言語に様々な影響を及ぼすと考えられます。
それに関しても色々調査していきたいと思います。