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