Retrolambda

參考文件

ref link
retrolambda https://github.com/orfjackal/retrolambda
gradle-retrolambda https://github.com/evant/gradle-retrolambda

為何要使用?

Android 目前最高支援到 Java7,言下之意就是 Java8 的東西我們都沒有辦法使用
為了能讓 Android 也能使用 Java8 lambda ,享受到新語法的快感(誤

什麼是 lambda?

lambda 是一種匿名(Anonymous) 表達式,這樣說好像有點抽象,用個例子示範一下

//未使用 lambda
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        System.out.println("click")
    }
});

//使用 lambda
button.setOnClickListener(view -> {
    System.out.println("click")
});

//還可以更簡化
button.setOnClickListener(view -> System.out.println("click"));

Thread 的 Runable 也是一個常用但囉說的語法,我們一樣可以透過 lambda 簡化它

//未使用 lambda
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("run");   
    }
});

//使用 lambda
new Thread(() -> System.out.println("run"));

lambda 語法

input -> body

view -> System.out.println("click")

intput 種類

無輸入 void
() -> body
單個輸入
x -> System.out.println(x)
多個輸入
(x, y) -> x + y;
不省略型別
(int x, int y) -> x + y;

body 種類

什麼都不做
() -> {}
單行不回傳,單行可省略{}
(x, y) -> x + y;
單行回傳
(x, y) -> x + y
多行不回傳
(x, y) ->{
  x * x;
  y * y;
}
多行回傳
(x, y) ->{
  x * x;
  y * y;
  return x + y;
}

如何在 Android 使用

我是使用 gradle-retrolambda 的 gradle 的 plugin,使用方法如下

  • 安裝jdk8

  • build.gradle 的最前面加上下列語法

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.1.0'
    }
}

repositories {
    mavenCentral()
}

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
  • 接著在 gradle android{}下 加上 retrolamdba
retrolambda {
    // 官方建議使用環境變數,不過我這邊路經都回傳 null
    //jdk System.getenv("JAVA8_HOME")
    //oldJdk System.getenv("JAVA6_HOME")
    //下列是我 mac java7 及 java8 的相對路徑 
    jdk '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home'
    oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_15.jdk/Contents/Home'    
    javaVersion JavaVersion.VERSION_1_7
    jvmArgs '-noverify'
    defaultMethods false
    incremental true
}
  • 最後在 android{} 下加入下列語法
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

results matching ""

    No results matching ""