3分鐘搞定 Android Lambda表達式

一、Lambda介紹

Lambda表達式是Java8新加入的特性。目的是讓我們初始化接口類型對象時代碼更加精簡!

所以他的出現就是定義不同類型的接口對象如何精簡化聲明。

如果只是想使代碼更精簡,按照下面的模版寫就可以了,後面的部分可以不看。

//只能用於單方法接口
Lambda公式:(param1,param2)->{  method body   }

其中 (params) 是方法的參數數量,有幾個寫幾個;->{ method body } 聲明方法體,裏面寫邏輯。

二、Lambda的使用限制

這裏需要先聲明一下他的限制條件:接口內只有一個方法

無論是我們聲明兩個參數一樣的方法:
在這裏插入圖片描述
還是聲明兩個參數不同的方法:
在這裏插入圖片描述
在語法上都會報錯。

好了說完了限定條件,我們需要掌握的知識就明確了。

Lambda主要解決的就是單方法接口的簡化。

當我們打開一個新的.java文件時會看到編譯器自動將某些代碼變成了Lambda表達式的形式,那麼可以想象成Google更推薦大家使用Lambda表達式進行Java代碼的書寫。

三、無參數接口初始化

例1、用Lambda表達式實現Runnable

使用之前:

new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("Before Java8, too much code for too little to do");
    }
}).start();

使用之後

new Thread( () -> System.out.println("Use Lambda , Inner class so easy!") ).start();

即直接通過"()->{ method body }"聲明方法體。

注1:如果方法體的方法只有一行,那麼花扣號也可以省略,如上面的例子。

四、單參數接口初始化

public class LambdaDemo {

    public LambdaDemo() {
        setInterface1(it -> {
        });

        setInterface1((String it)-> {
        });
    }

    public void setInterface1(Interface1 interface1) { }

    interface Interface1 {
        public void method1(String params);
    }

}

這裏我們可以直接定義變量名it,然後通過“->{ method body }” 方式聲明方法體。
it爲方法參數可以自定義名稱。

也可以使用“(String it)->{ method body }”即在扣號內聲明參數的類型的方式來聲明方法體。

五、多參數接口初始化

在這裏插入圖片描述
多參數時我們可以使用"(it1,it2)->{ method body }"的形式定義接口,如果參數增加只需要在括號內增加變量即可,如三個參數可以是“(it1,it2,it3)”,名稱可以自定義。

也可以使用“(String it1,int it2)-> { method body }”的形式定義,這裏只是明確了變量參數。

最後扣號的規則是,要麼都有類型聲明,要麼都沒有類型聲明,如第三個設置方法的寫法會報錯。

六、返回對象時的使用

在這裏插入圖片描述
從上面可以看出Lambda主要是優化了"new Interface()"對象的語法!

七、如何在Android中使用

由於Lambda是Java8引入的新特性,所以我們需要在module的gradle文件中加入Java版本限定:

android{
	...
	compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

加入限定後,我們就可以在我們的項目裏面使用Lambda表達式了。

八、結合RxJava

最後就是很多的Rxjava中的鏈式結構存在着大量的內部類,這個時候我們使用Lambda就可以極大的減少冗餘的代碼。

使用前:

Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
    .filter(new Func1<Integer, Boolean>() {
        @Override
        public Boolean call(Integer integer) {
            return integer % 2 == 0;
        }
    })
    .map(new Func1<Integer, Integer>() {
        @Override
        public Integer call(Integer integer) {
            return integer * integer;
        }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            System.out.println(integer);
        }
    });

使用後

Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
    .filter(integer -> integer % 2 == 0)
    .map(integer -> integer * integer)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(integer -> System.out.println(integer));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章