foldrr's weblog

旧ブログ http://d.hatena.ne.jp/foldrr/

Android Java で Retrolambda を使ってラムダ式を使う

環境

問題

解決方法

Retrolambda というライブラリを使うと コード上はラムダ式を使いつつ、 ビルド時に Android 上で実行できるバイトコードに変換してくれる。 手順は下記。

Gradle の設定ファイルを変更する。

// PROJECT/build.gradle
  buildscript {
      repositories {
          jcenter()
+         maven {
+             url "https://plugins.gradle.org/m2/"
+         }
      }
      dependencies {
          classpath 'com.android.tools.build:gradle:2.1.2'
+         classpath "gradle.plugin.me.tatarka:gradle-retrolambda:3.2.5"
      }
  }

  allprojects {
      repositories {
          jcenter()
      }
  }

  task clean(type: Delete) {
      delete rootProject.buildDir
  }
// PROJECT/app/build.gradle
  apply plugin: 'com.android.application'
+ apply plugin: 'me.tatarka.retrolambda'

  android {
      compileSdkVersion 24
      buildToolsVersion "24.0.0"

      defaultConfig {
          applicationId "example.com.androidretrolambda"
          minSdkVersion 19
          targetSdkVersion 24
          versionCode 1
          versionName "1.0"
      }
      buildTypes {
          release {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
      }
+     compileOptions {
+         sourceCompatibility JavaVersion.VERSION_1_8
+         targetCompatibility JavaVersion.VERSION_1_8
+     }
  }

  dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar'])
      compile 'com.android.support:appcompat-v7:24.0.0'
      testCompile 'junit:junit:4.12'
  }

Gradle の設定ファイルを変更したら Gradle Sync を実行する。 Gradle Sync が終わると下記のようにラムダ式が使えるようになっている。

// MainActivity.java
  public class MainActivity extends AppCompatActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          Runnable r = () -> {
              Toast.makeText(this, "run", Toast.LENGTH_SHORT).show();
          };
      }
  }

上記のようにラムダ式で記述できるのでコールバックが簡潔になる。
また this も外側の MainActivity.this が参照できる。

参考

以上。