Java 8が正式リリースされ早2か月。
やっとJavaでラムダ式が正式に使えるようになって嬉しい限り。
とはいえ、AndroidはAPI 19でJava 7がやっとサポートされたばかり。
でも諦めるのは早い。Retrolambdaがある!
Retrolabmdaとは
- ラムダ式をJava 7, 6, 5で使えるようにしたバックポートツール
- Java 8でコンパイルされたバイトコードをJava 7以下の環境で動作するように変換
- バックポートするのはラムダ式だけ。ほかのJava 8の機能はなし。
- gradle-retrolambdaというgradleのプラグインがある。
Retrolambdaを使うための設定
JDK 8をインストールする
OracleのサイトからJDK 8をダウンロードする。
環境変数JAVA8_HOME
を設定する。
Macの場合/usr/libexec/java_home
でインストールされているJDKのパスがわかるので、これを使って環境変数を設定しておくといい。
JAVA8_HOME=`/usr/libexec/java_home -v "1.8" -F`
if [ $? -eq 0 ]; then
export JAVA8_HOME
fi
のようにしておくといいかも。
gradle-retrolambda
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:+'
}
}
repositories {
mavenCentral()
}
apply plugin: 'android'
apply plugin: 'retrolambda'
retrolambda {
}
IntelliJ/Android Studioの設定
build.gradle
android {
....
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
のように設定すると、
[File]-[Project Structure]-[Project]で
- [Project SDK]が1.8に
- [Project language level]が
8.0 - Lambdas, type annotations etc.
に変わる。
ラムダ式の使いどころ
ラムダ式のありがたみについては、ここではあんまり書かないけど、
抽象メソッドが1つだけのインターフェースに使えるので以下のようなことができる。
リスナー
Button b = new Button(this);
b.setOnClickListener((View view) -> {
// 処理
});
引数の型を省略できるので
b.setOnClickListener((view) -> {
// 処理
});
引数が一つだと括弧も省略できるので
b.setOnClickListener(view -> {
// 処理
});
と書ける。
Runnable
Handler handler = new Handler();
handler.post(() -> {
// 処理
});