最近看了<無問西東>,有那麼一丟丟小感想.我特別認同,這個觀點:思考人生並非浪費時間的事情,許多偉大的人
也常常思考生命的意義,生活的意思.怎麼樣作到對本身真實,彌足珍貴.
還有就是請忽略都是英文標點符號!!!我很懶,切換太累了.
長時間加班真滴很累,吐槽完仍是得繼續啊~~
複製代碼
jdk1.8就可以使用lambda表達式了。在android開發中,使用lambda表達式能夠省去寫匿名內部類,最簡單的例子那就是對view設置點擊事件. koltin的lambda表達式,擁有更多的futures,請容許小學生開始表演:java
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
action();//具體邏輯
}
});
複製代碼
利用lambda表達式能夠省略成這樣android
button.setOnClickListener{ action() }
複製代碼
可能有些對lambda表達式不熟悉的同窗就比較困惑了,爲何{ }包起來的就是一個lambda式子,就能夠省去寫匿名內部類. 下面我將給你們分析一下;bash
lambda表達式完整的語法格式: eg:app
1.
val sum={a:Int,b:Int -> a+b }
複製代碼
若是咱們把可選標註留下,上述式子就是以下樣子:ide
2.
val sum:(Int ,Int) ->Int ={ a,b -> a+b}
複製代碼
在kotlin中,函數也是一個對象,因此上述式子能夠理解爲,只讀變量sum 是一個入參爲兩個Int值,返回值也是Int的一個函數類型, 而該函數的具體類型是{ a,b -> a+b}函數
kotlin有個特性,當函數返回類型可推斷時,能夠省略類型,即省略函數型申明,2式就能夠簡化成1式;ui
知道了上面這個,讓咱們再回過頭來分析一下this
button.setOnClickListener{ action() }
複製代碼
的由來.google
button的setOnclickListener接受一個OnviewClick對象o,回調執行o.onClick(View v)方法; 那麼其入參能夠寫成:spa
button.setOnClickListener(o:(view:View) -> Unit)
複製代碼
傳入具體lambda函數對象:
button.setOnClickListener({view -> action()})
複製代碼
==>kotlin中當函數只有一個參數時,參數能夠省略:
button.setOnClickListener({action()})
複製代碼
==>kotlin中,當函數參數是函數的最後一個參數時,能夠在()後指定它,因此能夠表示成:
button.setOnClickListener(){action()}
複製代碼
==>kotlin中,當函數參數是函數的惟一參數,能夠省略(),因此能夠表示成:
button.setOnClickListener{action()}
複製代碼
上述這個式子就是我文章開頭寫的式子; 不知道你們看到這裏有沒有明白呢?
不知道你們有沒有思考過一個問題呢,函數參數只有一個參數時,咱們省略了參數,那若是這個參數我須要在函數體中使用,那該怎麼辦呢? 有人可能會說,那我就不省略它唄.這點沒錯,顯式申明入參,在函數體中能夠直接使用該參數,但在kotlin中,會隱含的爲咱們聲明其名稱:"it"; 因此 須要給當前view設置文本能夠以下表示:
button.setOnClickListener{ action()
it.text="google Jiang"
}
複製代碼
這裏的it就表示view;
kotlin強大之處,就是它支持的擴展函數.在java中,咱們爲某個類增添一個方法一般,須要繼承該類,並增長一個方法; 在kotlin中能夠免去這樣的操做 舉個栗子:
public class Foo{
public void sing(String song){
Log.d(TAG,"Foo sing:"+song)
}
}
複製代碼
要爲該類增長一個talk()方法,用kotlin能夠這麼寫:
Foo.talk(talk:String ){
Log.d(TAG,"Foo talk: $talk")
}
Foo().apply{sing("慢慢喜歡你")}.talk("lovely")
複製代碼
結果Log輸出:
Foo sing:慢慢喜歡你
Foo talk:lovely
kotlin中有一個標準的函數庫StandardKt.class,定義了許多擴展函數apply,run ,let等等.....; 咱們能夠分析一下apply源碼,帶你們瞭解一下擴展函數的意義:
@1
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
複製代碼
咱們來具體分析一下apply函數: inline表示內聯函數,若是不懂什麼意思咱們先忽略,有時間我再說一下, T是泛型,T.apply表示在T類上擴展一個apply函數,其入參block爲一個無返回值的函數對象,apply返回值是T類型,函數具體執行的是入參block(),而且把自身返回去,即返回T;
看到這裏必定有小夥伴疑惑了,這個block函數T.()->Unit 究竟是啥意思?
聯繫一下上面講到的lambda標準表達式,->左邊表示參數,右邊表示返回值 因此block 參數就是T.(),表示入參是T的一個函數; block的返回值就是void; 因此,apply能夠作到,對任意對象T,調用T.apply{ },傳入T的一個函數fun1,執行fun1,而且返回T自己,這樣就能夠作到鏈式調用了;
純手打,就分析到這了,文章比較短(ps能逼逼這麼多已經很不容易了);
以上有理解錯誤的地方,還請指出,我仍是個小學生QAQ;
嘗試一波知識變現,來人啊打賞(只是玩玩,原諒個人厚顏無恥 哈哈哈哈)
上圖:
複製代碼