Reactive Programming : retrolambda を使ってAndroidでラムダ式を導入してみる

Java8からStream APIラムダ式など、Reactive Programming的なモダンなパラダイムや文法がサポートされ、Androidでも利用したいと思うようになってきました。

RxAndroidなどを利用したStreamAPIの導入は、職場などではより一層ハードルも高いですが、ラムダ式などは敷居も低く、できれば導入したいと思うところです。

今回は、retrolambdaというバックポートツールを使ってラムダ式の導入を試して見たいと思います。

導入

基本的に特別なことはなにもないです。

本家のGithubにあるREADMEに従ってGradleを変更すればOKです。

github.com

RxAndroidとあわせて導入している事例は下記が参考になりました。

sys1yagi.hatenablog.com

build エラーに対応する

Android StudioではJava7でビルドを仕掛けますが、retrolambdaではJava8を利用するようで、その指定が必要です。

しかし、GithubにあるようにJAVA8_HOMEの指定をしても、うまくビルドが通せません。

Error:Execution failed for task ':app:compileDebugJava'.
> When running gradle with java 5, 6 or 7, you must set the path to jdk8, either with property retrolambda.jdk or environment variable JAVA8_HOME

これはAndroid Studio環境変数を参照していないことが原因です。 つまりターミナルで設定しているローカルな環境変数(.bash_profileなど)は、別のプロセスで動作するAndroid Studio には影響を与えられない、ということのようです。

Setup problem? · Issue #17 · evant/gradle-retrolambda · GitHub

従って、上記にあるように環境変数のスコープを広げるか、ローカルな環境変数が設定されたプロセスでAndroid Studioを起動するかすれば解決できることになります。

とりあえず、コマンドラインから起動して、ローカル環境変数を有効にしてみます。

$ cd /Applications/Android Studio.app/Contents/MacOS
$ ./studio

これでビルドできました!