<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Kotlin中的Lambda表達式

          共 2727字,需瀏覽 6分鐘

           ·

          2021-04-13 16:57

          點擊左上方[藍色小字],關注[國民程序員]

          每天滿滿的干貨

          我們之所以活得累,往往是因為放不下面子來做人。

          由于微信公眾號近期改變了推送規(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)


          ● 超完整的程序員技能圖譜,看完一定不會后悔!

           1700篇大廠面試真題珍藏版(每天更新)

           想要年薪百萬,你不能錯過這套互聯(lián)網(wǎng)架構(gòu)師資料

          微信搜一搜
          國民程序員
          點分享
          點點贊
          點在看
          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.天天好逼 | 久久天天躁 | 成人H动漫精品一区二区无码软件 | 思思热在线观看视频 | 黄色片国产 |