Android 使用Java8新特性之Lambda expression

來源:互聯網
上載者:User

標籤:esc   center   2.2.3   code   www   each   down   enter   tps   

前言

Lambda expression,java8的新特性。使用Lambda expression,可以替代只有一個函數的介面實現,告別匿名內部類,代碼看起來更簡潔易懂。
java8還有其它一些新特性,不過在android上可能都無法使用。
studio 2.x後 支援jack編譯器,使用它,能使用java8的Lambda expression,但其它特性也不敢保證就能用。

註:Android SDK中整合了JDK的一些源碼,有些原生JDK中的類,可能增加了新特性的一些實現,但Android中的並沒有。

還可以使用外掛程式retrolambda來支援java8的Lambda expression。

Jack 配置

添加如下配置

android {    defaultConfig {        minSdkVersion 24 //7.0    }    jackOptions {        enabled true    }    compileOptions {//jack、retrolambda編譯必需        sourceCompatibility JavaVersion.VERSION_1_8        targetCompatibility JavaVersion.VERSION_1_8    }}

以啟用jack編譯器,來支援Lambda expression

retrolambda 配置

項目地址:https://github.com/evant/gradle-retrolambda

retrolambda 為了相容java5、6、7使用Lambda expression而產生。

配置如下

buildscript {    repositories {        jcenter()    }    dependencies {        classpath ‘com.android.tools.build:gradle:2.2.3‘        classpath ‘me.tatarka:gradle-retrolambda:3.6.0‘    }}apply plugin: ‘me.tatarka.retrolambda‘android {    defaultConfig {        minSdkVersion 11 //這個沒有硬性要求    }    compileOptions {//jack、retrolambda編譯必需        sourceCompatibility JavaVersion.VERSION_1_8        targetCompatibility JavaVersion.VERSION_1_8    }}

註:為了相容7.0以下版本,jack方式,不適用。所以一般還是選取retrolambda

Lambda expression的使用方式

首先,我們要知道的是,該運算式,整體上是表達了一個『物件類型』。

最簡單的Lambda expression

代碼:

Runnable runnable = () -> System.out.println("hi, 我是 stone");runnable.run();

()其實就是方法參數列表,這裡沒有傳參數,那麼就會去匹配無參的方法,因Runnable只有一個void run(),所以會匹配到它;這裡沒有寫方法名,所以方法的名字會被忽略。

-> 這個後面跟方法體。這裡只有一句列印代碼,可以省略方法體的花括弧:{} 。

註:這裡還省略了”new Runnable”這樣的代碼,是因為編譯器會進行自動的類型推斷。如果直接調用 () -> System.out.println(“hi, 我是 stone”).run(); 那麼是編譯不過的,因為編譯器不知道去哪個類裡找對應的方法

有參數且有傳回值的Lambda expression

代碼:

button.setOnTouchListener((view, event)-> {    if (event.getAction() == MotionEvent.ACTION_DOWN) {        if (flag) {            return true;        }    }    return super.onTouchEvent(event);});

有參數時,只要傳參數名字即可,名字可隨意定義;類型定義或不定義都可以;不定義時,編譯器會自動推斷。
有傳回值時,可以在方法體中,使用return;也可以在只有一段代碼時,省略return,如下:

button.setOnTouchListener((v, e) -> super.onTouchEvent(e));

Android 使用Java8新特性之Lambda expression

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.