Java
Android

Androidでラムダ式を使いたい

More than 3 years have passed since last update.

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(() -> {
// 処理
});