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

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

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

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

導入

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

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

A gradle plugin for getting java lambda support in java 6, 7 and android - GitHub - evant/gradle-retrolambda: A gradle plugin for getting java lambda support in java 6, 7 and android
GitHub - evant/gradle-retrolambda: A gradle plugin for getting java lambda support in java 6, 7 and android

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

※これもう大分古いので AndroidでJava8環境 2016 - visible true も御覧ください。 はじめに RxAndroid(というかRxJava)とRetrolambdaでそろそろ大体Java8な環境でAndroidアプリケーションが開発出来るのではないかと考えて試してみた。 2014年4月頃のRetrolambdaはまだ1.1.4とかでlambdaをおまけ程度に使える程度で「あー戯れって感じねはいはい」という事でスルーしていたんだけど、最近久しぶりに覗いたら1.8.0まで育っていてTry-with-resources*1やMethod referencesがサポートされて…
RxAndroidとRetrolambdaで大体Java8をAndroidに持ち込む - visible true

build エラーに対応する

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

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

1
2
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を起動するかすれば解決できることになります。

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

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

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

Built with Hugo
テーマ StackJimmy によって設計されています。