Kotlin 進階教程(一)

ZENLovely發表於2018-06-08

前言

最近看了<無問西東>,有那麼一丟丟小感想.我特別認同,這個觀點:思考人生並不是浪費時間的事情,許多偉大的人
也經常思考生命的意義,生活的意思.怎麼樣做到對自己真實,彌足珍貴.
 還有就是請忽略都是英文標點符號!!!我很懶,切換太累了.
長時間加班真滴很累,吐槽完還是得繼續啊~~
複製程式碼

Kotlin 進階教程(一)

1) lambda 表示式的使用

jdk1.8就能夠使用lambda表示式了。在android開發中,使用lambda表示式可以省去寫匿名內部類,最簡單的例子那就是對view設定點選事件. koltin的lambda表示式,擁有更多的futures,請允許小學生開始表演:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                action();//具體邏輯
            }
        });

複製程式碼

利用lambda表示式可以省略成這樣

button.setOnClickListener{  action() }
複製程式碼

可能有些對lambda表示式不熟悉的同學就比較困惑了,為什麼{ }包起來的就是一個lambda式子,就可以省去寫匿名內部類. 下面我將給大家分析一下;

lambda表示式完整的語法格式: eg:

1.
val sum={a:Int,b:Int -> a+b }
複製程式碼

如果我們把可選標註留下,上述式子就是如下樣子:

2.
val sum:(Int ,Int) ->Int ={ a,b -> a+b}
複製程式碼

在kotlin中,函式也是一個物件,所以上述式子可以理解為,只讀變數sum 是一個入參為兩個Int值,返回值也是Int的一個函式型別, 而該函式的具體型別是{ a,b -> a+b}

kotlin有個特性,當函式返回型別可推斷時,可以省略型別,即省略函式型申明,2式就可以簡化成1式;

知道了上面這個,讓我們再回過頭來分析一下

button.setOnClickListener{ action() }
複製程式碼

的由來.

button的setOnclickListener接受一個OnviewClick物件o,回撥執行o.onClick(View v)方法; 那麼其入參可以寫成:

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;

2)擴充套件函式

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;
嘗試一波知識變現,來人啊打賞(只是玩玩,原諒我的厚顏無恥 哈哈哈哈)
上圖:
複製程式碼

Kotlin 進階教程(一)

相關文章