一、介紹
????????目前在Java JDK版本的不斷升高,新的表達(dá)式已開始出現(xiàn),但是在Android混淆開發(fā)中,kotlin的語(yǔ)言與Java的語(yǔ)言是緊密貼合的。所以Java lambda表達(dá)式在kotlin中以新的身份出現(xiàn):高階函數(shù)與lambda表達(dá)式特別類似。接下來我講會(huì)先講Java的lambda,再介紹kotlin的高階函數(shù)。
二、Java lambda表達(dá)式介紹與實(shí)戰(zhàn)
2.1lambda的表達(dá)式格式介紹
1. 不需要參數(shù),返回值為 5 () -> 5 2. 接收一個(gè)參數(shù)(數(shù)字類型),返回其2倍的值 x -> 2 * x 3. 接受2個(gè)參數(shù)(數(shù)字),并返回他們的差值 (x, y) -> x – y 4. 接收2個(gè)int型整數(shù),返回他們的和 (int x, int y) -> x + y 5. 接受一個(gè) string 對(duì)象,并在控制臺(tái)打印,不返回任何值(看起來像是返回void) (String s) -> System.out.print(s)
大致可以分為幾類:
1.有參數(shù)無返回值(String msg)->
2.無參數(shù)有返回值()->Int
3.有參數(shù)有返回值(int a,int b)->()
2.2實(shí)戰(zhàn)
????????Java lambda表達(dá)式是通過接口定義出來,一個(gè)接口只能定義一種類型,具體邏輯需要通過Java lambda自行定義,接口只想當(dāng)一種類型
interface Add {
int add(int a, int b); //返回值
}
上面定義了一個(gè)Add類型,
Add add = (int a, int b) -> (a + b);//什么+
Add sub = (int a, int b) -> (a - b);//申明-
Add mul = (int a, int b) -> (a * b);//申明
通過Add類型定義了三種lambda操作符。這樣就完成了
使用
1.第一種通過操作符類型自行執(zhí)行
public int operation(int a, int b, Add add) {
return add.add(a, b);
}
2.直接調(diào)用
add.add(10, 20)
2.3實(shí)戰(zhàn)Demo
public class TestJava {
@Test
public void main() {
TestJava tester = new TestJava();
Back back = () -> 4;
Log log = (String msg) -> com.example.lib.Log.INSTANCE.log(msg);
//單個(gè)形參,可以不用注明變量類型
Log log1 = msg -> com.example.lib.Log.INSTANCE.log(msg);
Add add = (int a, int b) -> (a + b);//什么+
Add sub = (int a, int b) -> (a - b);//申明-
Add mul = (int a, int b) -> (a * b);//申明
com.example.lib.Log.INSTANCE.log("back=" + back);
log.log("我調(diào)用了Log");
com.example.lib.Log.INSTANCE.log("add=" + add.add(10, 20));
tester.operation(50, 10,add);
tester.operation(50, 10,sub);
}
public int operation(int a, int b, Add add) {
return add.add(a, b);
}
interface Back {
int back(); //返回固定參數(shù)
}
interface Add {
int add(int a, int b); //返回值
}
interface Log {
void log(String msg);
}
}
三、kotlin的高階函數(shù)定義與使用
????????通過Java的lambda的表達(dá)式學(xué)習(xí),已掌握了表達(dá)式的使用。在kotlin中,把lambda的表達(dá)式定義為高階函數(shù)。用法差不多
在kotlin中,高階函數(shù)的定義:
格式:函數(shù)名(形參類型...)->返回值
例如:add(Int ,Int)->Int,log(String)->Unit
形參只需要申明參數(shù)類型,可以支持多個(gè)或者為空。返回值,如果不需要直接些Unit
使用教程
kotlin的高階函數(shù)與Java的lambda表達(dá)式很相似,但是用法不同,高階函數(shù)是用在函數(shù)中的,作為參數(shù)使用。類似與接口回調(diào)。
實(shí)戰(zhàn):
1.定義一個(gè)加法
fun add(a: Int, b: Int, log: (Int, Int) -> Int) {
val data = log(a, b)
Log.log(data)
}
2.調(diào)用
test.add(2, 3, { a, b ->
Log.log("a + b=${a + b}")
a + b
})
test.add(2, 4) { a, b ->
a + b
}
正常調(diào)用有兩種:
1.參數(shù)在方法體中(2,3,{a,b->})
2.方法外(2,4){a,b->}
注意:如果有返回值,最后一行表達(dá)式或者參數(shù)將作為函數(shù)變量返回,無需用return
引用調(diào)用兩種:
1.在函數(shù)體定義一個(gè)函數(shù)與方法中的參數(shù)函數(shù)一樣,實(shí)現(xiàn)這個(gè)函數(shù)的方法體
fun addNum(a: Int, b: Int): Int {
return a + b
}
調(diào)用:
用當(dāng)前函數(shù)變量引用這個(gè)方法即可
val addNum3 = test.add(1, 2, test::addNum)
2.在函數(shù)體外定義一個(gè)方法,kotlin支持在函數(shù)體外定義函數(shù),這個(gè)函數(shù)類似全局函數(shù),只是調(diào)用只需指向函數(shù)名,不需要當(dāng)前類。
val addNum2 = test.add(1, 2, ::addNum)
Demo:
class Test {
fun add(a: Int, b: Int, log: (Int, Int) -> Int) {
val data = log(a, b)
Log.log(data)
}
fun log(msg: String, show: (String) -> Unit) {
show(msg)
}
fun addNum(a: Int, b: Int): Int {
return a + b
}
}
fun main() {
val test = Test()
test.add(2, 3, { a, b ->
Log.log("a + b=${a + b}")
a + b
})
test.add(2, 4) { a, b ->
a + b
}
test.log("msg") {
Log.log(it)
}
val addNum2 = test.add(1, 2, ::addNum)
Log.log("addNum2=${addNum2}")
val addNum3 = test.add(1, 2, test::addNum)
Log.log("addNum3=${addNum3}")
}
// ::addNum 這是一種函數(shù)引用的寫法,表示將函數(shù)addNum()來作為參數(shù)傳遞給高階函數(shù)
fun addNum(a: Int, b: Int): Int {
return a + b
}
四、總結(jié)
????????kotlin的寫法是比較特殊,高階函數(shù)類似接口返回,Java中的lambda的表達(dá)式,更像一個(gè)定義語(yǔ)言。但是語(yǔ)法接口類似,只是在使用上有所區(qū)別。文章來源:http://www.zghlxwxcb.cn/news/detail-609036.html
????????特別是kotlin,在大趨勢(shì)kotlin的寫法中,高階函數(shù)使用特別多,甚至一些開發(fā)者把高階當(dāng)成接口回調(diào)。新手特別注意。文章來源地址http://www.zghlxwxcb.cn/news/detail-609036.html
到了這里,關(guān)于Android kotlin高階函數(shù)與Java lambda表達(dá)式介紹與實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!