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