繼續學習Kotlin反射相關的東東。
KClass:
在上一次是通過類來獲取它的KClass對象:
那如果是一個對象呢?與這個對象對應的類的KClass對象又是如何獲取的呢?像Java也是一樣有相關機制的,下面看一下:
其實使用跟用類是一樣的,那結果是啥呢?運行一下:
這樣就打出來了具體類型了,由於是咱們自己定義的類,所以其KClass和Class是同一個,跟上一次用的系統類輸出是不一樣的。
函數(方法)引用:
由於在之前JAVA8中已經詳細學習過方法引用了,就不多解釋了,它其實是Lambda表達式的一種更加簡潔的寫法, 下面來看一下在Kotlin中的使用:
這里當然得用Lambda表達式的方式嘍,具體如下:
對於函數引用其實也支持重載的方式,編譯器會自動來選擇對應的函數,啥意思,下面舉例說明一下,再定義一個函數:
接下來修改一下程序:
那,對於第一個"::mutiplyBy3"和第二個"::mutiplyBy3"倒底對應哪個類型呢?我們可以將一個函數引用賦值給一個變量,下面來看一下:
上面這種函數是定義在包級別的,而非放在類中,那。。如果將函數定義在某個類中,那其方法引用又如何來寫呢,比如說Kotlin中的String類:
那很明顯它是一個實例方法,也可以用方法引用的方式來定義函數,所以我們可以這樣寫:
那請問下myRefrence3的類型聲明應該是咋樣的?很簡單嘛:
但此時是不對的,現在是類里面的函數了,所以應該要帶上類了,如下:
要想比較輕松的理解Kotlin的方法引用,前提是要對Java8的方法引用有比較深刻的了解才行,不然這塊確實是有些抽象。
一個較復雜的高階函數(函數組合)演練:
啥叫高階函數這里就不多說了,其實就是一個函數參數中是傳的一個函數,也就是函數套函數,如今這種形式在很多的開源框架上都得到了大量的運用,所以下面定義一個比較繞的函數,然后將們的思維進行操練來適應這種新的編程范式,如下:
暈了木有。。解釋一下,其實要習慣這種函數鏈函數最終生成一個新的結果的方式:
其實簡單來說,就是A參數經過g函數生成的結果再作為f函數的參數再生成整個myCompose函數的結果,有點繞,其實如果Java8學得比較扎實的話看這種程序其實是比較順其自然的,就是函數式編程的范示,下面來完成整個函數的函數體:
那定義這個組合函數有啥用呢?由於該函數需要兩個函數做為參數,所以在調用之前再定義兩個函數:
那接下來調用一下myCompose(),其效果是從字符串集合中找出其字符串長度是偶數的元素,如下: