techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

RxAndroid x Retrolambdaでモダンな実装を試す

前回はRxAndroidでリアクティブプログラミングに入門するために、ダブルクリックイベントを検出するサンプルを作成しました。

実際にやってみた感想として、リアクティブプログラミングのコンセプトは非常に便利だと感じましたが、単純にJava単体で実装すると匿名クラスまみれになって非常にツライことになるということがわかりました*1

ラムダが使えないとツラすぎてお話にならないのでRetrolambdaを導入して前回のサンプルをラムダで書きなおしてみます。

Retrolambdaを導入する

Retrolambdaの導入記事は良記事が多数公開されているので、それらを参考に導入します。特に以下の記事を参考にさせていただきました。

Retrolambdaを使うためにはJava8をインストールする必要がありますが、Java8をインストールしただけでは以下のエラーが出てビルドが失敗します。 Error:Execution failed for task ':app:compileDebugJavaWithJavac'. 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

どうやらJava8でコンパイルする設定になっていないようなので、先ほどインストールしたJava8でコンパイルするように設定します。環境変数JAVA8_HOMEがJDK8のものになっていないと言われていますが、環境変数を追加しなくても「File→Project Structure→SDK Location」内のJDK LocationにJDK1.8のHomeを設定してやればビルドできるようになりました。

Macなら/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Homeのような値になります(バージョンは適宜読み替えてください)。

上記の設定が正常に完了すればRetrolambdaでラムダ式を使用することができるようになります。

ラムダを使ってみる

それでは前回のダブルクリックイベントを検出するサンプルをラムダを使って書きなおしてみます。元のコードは以下の通りです。

RxAndroidでダブルクリックイベントをキャプチャする

ラムダを使わないと全体的に匿名クラスだらけで本質的でないボイラープレートコードを大量に記述する必要があるのがわかります。

これをラムダで書き直したのが以下のコードです。

RxAndroid x Retrolambdaでモダンな実装を試す

匿名クラスがなくなり本質的な処理のコードだけを記述すればよくなったことで、全体的な記述量が削減されインデントも浅くなり、元のコードに比べて非常に読みやすくなっているのがわかります。特にnew Func1<Integer, Integer>()のような記述をせずに済むようになるのは非常に嬉しいところです。Androidでは匿名クラスを多用するためラムダの恩恵が特に大きいですね。

*1:もちろんJava8が使えれば問題ないですが