Kotlin中的Lambda表達式
每天滿滿的干貨
我們之所以活得累,往往是因為放不下面子來做人。
由于微信公眾號近期改變了推送規(guī)則如果你第一時間看到我的文章就置頂星標公眾號。


文章目錄
1.函數(shù)式編程
2.Lambda定義
3.Lambda應用: 高階函數(shù)
4.Lambda應用: 簡化
1.函數(shù)式編程
在理解lambda表達式之前,我們先了解下什么是函數(shù)式編程。
函數(shù)式編程是一種如何編寫程序的方法論,它將電腦運算視為函數(shù)的運算,其主要思想是把運算過程盡量寫成一系列的函數(shù)嵌套調(diào)用。
函數(shù)式編程的基礎是Lambda(λ )演算,λ演算的函數(shù)可以接受函數(shù)當作輸入(參數(shù))和輸出(返回值)。
相比于指令式編程(或叫命令式編程,Imperative),函數(shù)式編程(屬于聲明式編程,Declarative)更加注重函數(shù)的計算。

函數(shù)式編程的特點:
函數(shù)第一原則
函數(shù)是第一公民,它可以出現(xiàn)在任何地方,比如可以把函數(shù)作為參數(shù)傳遞給另一個函數(shù),也可以將函數(shù)作為返回值。
目前主流的編程語言,比如Java中的Lambda表達式和閉包,已經(jīng)提供了對這種編程方式的支持。
Kotlin本身就完美地支持函數(shù)式編程。
2.Lambda定義
前面介紹了函數(shù)式編程,其核心是λ演算,而Lambda表達式就是λ演算的一部分。
Lambda表達式其實就是將一段代碼封裝成匿名函數(shù),以參數(shù)值的形式傳遞到函數(shù)中(第一公民),供函數(shù)使用。
接下來我們看看Lambda表達式的用法。
首先看看規(guī)則:
1. kotlin中l(wèi)ambda表達式定義在{}中
2. 其參數(shù)(如果存在)在 -> 之前聲明(參數(shù)類型可以省略)
3. 函數(shù)體(如果存在)在 -> 后面
//源代碼:無參fun l1() {println("無參數(shù)")}//lambda表達式: 以值的形式傳遞val l1 = { println("無參數(shù)") }//調(diào)用l1()//源代碼:有參fun l2(x: Int, y: String) {println(y.length + x)}//lambda表達式: 以值的形式傳遞val l2 = { x: Int, y: String -> println(y.length + x) }//調(diào)用l2(1, "Mike")//lambda表達式也可以直接通過run運行run { l2(1, "tom") }
3.Lambda應用: 高階函數(shù)
kotlin中的高階函數(shù)是可以將函數(shù)作為參數(shù)傳遞或者返回值返回的函數(shù)。
既然函數(shù)能作為參數(shù),那么我們看看函數(shù)作為參數(shù)傳遞的規(guī)則:
() -> Unit//表示無參數(shù)無返回值的Lambda表達式類型
(T) -> Unit//表示接收一個T類型參數(shù),無返回值的Lambda表達式類型
(T) -> R//表示接收一個T類型參數(shù),返回一個R類型值的Lambda表達式類型
//普通函數(shù)fun add(x: Int = 0, y: Int = 0): Int {return x + y}//foo可以理解為這個lambda表達式的別名fun operate(x: Int = 0 ,y: Int = 0, foo: (Int, Int) -> Int) {print("this result is " + body(x,y))}//可以用::調(diào)用函數(shù)fun caculate(){operate(3,7, ::add2)}//也可以直接傳入lambda表達式fun caculate(){operate(3,7, {x, y -> x + y})}
4.Lambda應用: 簡化
val people = listOf(User("張三", 18), User("李四", 20))//1.1 函數(shù)只有l(wèi)ambda一個實參//原始完整代碼println("年紀最大:" + people.maxBy({ user: User -> user.age }))//step1:如果lambda表達式是函數(shù)調(diào)用的最后一個實參,它可以放在括號外面println("年紀最大:" + people.maxBy() { user: User -> user.age })//step2:當lambda是函數(shù)唯一的實參時,可以去掉函數(shù)調(diào)用的括號println("年紀最大:" + people.maxBy { user: User -> user.age })//step3:如果lambda的參數(shù)的類型可以推導,那么可以省略參數(shù)的類型println("年紀最大:" + people.maxBy { user -> user.age })//step4:對于lambda中一個參數(shù)時,可以使用默認參數(shù)名稱it來代替命名參數(shù),并且lambda的參數(shù)列表可以簡化,省略參數(shù)列表和->println("年紀最大:" + people.maxBy { it.age })//1.2 函數(shù)有除了lambda外多個實參fun lambdaTest1(a: Int, b: (String) -> String) {println("$a + ${b(a.toString())}")}fun lambdaTest2(b: (String) -> String, a: Int) {println("$a + ${b(a.toString())}")}//調(diào)用lambdaTest1(11) {"hello: $it"}//調(diào)用lambdaTest2({ "hello: $it" }, 22)







