標籤: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