Help us understand the problem. What is going on with this article?

Androidでラムダ式を使いたい

More than 5 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(() -> {
  // 処理
});
kamimoo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away