<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 新特性你真的了解嗎?

          共 27708字,需瀏覽 56分鐘

           ·

          2021-07-04 11:49

          點(diǎn)擊“開發(fā)者技術(shù)前線”,選擇“星標(biāo)”

          讓一部分開發(fā)者先看到未來

          前言

          Kotlin作為Android開發(fā)的新選擇,具有簡(jiǎn)潔、安全、函數(shù)式編程等特點(diǎn),在實(shí)際開發(fā)中使用起來非常方便。經(jīng)過一段時(shí)間的實(shí)際應(yīng)用,對(duì)Kotlin的基礎(chǔ)使用做個(gè)總結(jié),主要對(duì)Kotlin基礎(chǔ)應(yīng)用結(jié)合實(shí)例進(jìn)行介紹,從基本語法、類與對(duì)象和函數(shù)三個(gè)方面展開。

          一.基本語法


          1.1 變量聲明

          Kotlin中使用var/val關(guān)鍵字來聲明變量
          ?var關(guān)鍵字聲明的是可變變量,val關(guān)鍵字聲明的是只讀變量
          /**  * 學(xué)生類  */ 
          class Student {     
            //可變變量聲明關(guān)鍵字var
            var name: String = "小明"     
            //不指定變量類型的隱式聲明
            var age = 10   
            //只讀變量聲明關(guān)鍵字val
            val sex: String = "男"    
            
            fun learn() {    
              print("$name is learning")    
              }

          Kotlin中編譯器可以通過變量的值來自動(dòng)推導(dǎo)變量是什么類型的,這種功能稱為自動(dòng)類型推導(dǎo),不指定變量類型的聲明方式叫隱式聲明。

          1.2 語句

          when表達(dá)式
          //when語句可以作為表達(dá)式,符合條件的分支就是整個(gè)表達(dá)式的值
           val b = when (num) {     
              in 0..9 -> {true}     
              else -> { false }
             } 
          in關(guān)鍵字的使用
          //判斷是否在區(qū)間內(nèi) 
          if (num in 1..9) {     
              print("ok"
          }  
          //不在區(qū)間內(nèi) 
          if (num !in 1..9) {     
              print("no"
          }  
          //遍歷數(shù)組 
          for (name in names) {     
              print(name)
          }  
          //判斷name是否在數(shù)組內(nèi)
          if (name in names) {     
              print("ok"

          類型轉(zhuǎn)換
          Kotlin中可以使用 is 關(guān)鍵字進(jìn)行類型判斷
          fun foo(o: Any): Int {     
                if (o is String) {         
                   //判斷完類型之后,o會(huì)被自動(dòng)轉(zhuǎn)換為String類型         
                   return o.length    
                }      
                //可以使用!is來取反    
                if (o !is String) {         
                    return 0  
                 }     
                 return 0
              } 
          空值檢測(cè)
          Kotlin中可以使用?來進(jìn)行空值檢測(cè) 例如str?.length 來表示str不為空時(shí)執(zhí)行獲取長(zhǎng)度操作,可以避免空指針異常。

          1.3 函數(shù)聲明

          聲明一個(gè)簡(jiǎn)單的函數(shù)如下:
          fun plus(x: Int, y: Int) : Int {    
               return x + y 
           } 
          上述函數(shù)是聲明一個(gè)plus()函數(shù),接收兩個(gè)參數(shù)x和y  返回Int類型的值
          Kotlin中方法聲明的關(guān)鍵字是fun,聲明的定義格式為:

          ?
          見性修飾符  fun  函數(shù)名(參數(shù)名:類型,...) : 返回值類型{   函數(shù)體 }

          Tips:
          1.如果函數(shù)體內(nèi)實(shí)現(xiàn)很簡(jiǎn)單只有一行代碼那么函數(shù)也可以這樣寫
          fun plus(x: Int, y: Int): Int = x + y 
          2.如果返回值是編譯器能夠推斷出的類型例如Int 那么返回值類型也可以省略
          fun plus(x: Int, y: Int) = x + y

          1.4 函數(shù)的默認(rèn)參數(shù)

          Kotlin中可以使用默認(rèn)參數(shù)實(shí)現(xiàn)重載類似功能,減少重載數(shù)量
          fun plus(x: Int, y: Int = 10) : Int {     
                return x + y 

          plus()函數(shù)中y參數(shù)有默認(rèn)值10 那么我們調(diào)用的時(shí)候可以通過plus(11,20) 指定y的值,也可以省略y使用默認(rèn)值 plus(11) y使用默認(rèn)值10

          可變參數(shù)

          //java中,可變參數(shù)使用...表示
          public void selectCourse(String... strArray){
              
          }

          //kotlin中,可變參數(shù)使用vararg關(guān)鍵字表示 
          fun selectCourse(vararg strArray: String?) {    
             

          二.類與對(duì)象


          2.1 類的構(gòu)造函數(shù)

          Kotlin中一個(gè)類可以一個(gè)主構(gòu)造函數(shù)以及一個(gè)或者多個(gè)次構(gòu)造函數(shù),主構(gòu)造函數(shù)是類頭的一部分:它跟在類名之后,如果主構(gòu)造函數(shù)沒有任何注解或者可見性修飾符,可以省略constructor關(guān)鍵字
          //聲明帶一個(gè)參數(shù)的主構(gòu)造函數(shù)
          class Person constructor(name:String){
             
             init {
                  //初始化的代碼可以放到init初始化塊中
                  //初始化塊是主構(gòu)造函數(shù)的一部分,因此所有的初始化塊中的代碼都會(huì)在次構(gòu)造函數(shù)體之前執(zhí)行
              }
              
              //次級(jí)構(gòu)造函數(shù)委托給主構(gòu)造函數(shù)直接委托
              constructor(name:String,parent:Person):this(name){
              
              }
              
              //委托給別的次級(jí)構(gòu)造函數(shù)間接委托
              constructor(name:String,parent:Person,age:Int):this(name,parent){
               
              }
          }

          2.2 類的繼承

          在Kotlin中所有類都有一個(gè)共同的超類Any,對(duì)于沒有超類型聲明的類是默認(rèn)超類,Any有三個(gè)方法:equals()、hashCode()和toString(),為所有Kotlin類都定義了這些方法。
          如果派生類有一個(gè)主構(gòu)造函數(shù),其基類型則必須用基類的主構(gòu)造函數(shù)參數(shù)初始化
          class Derived(p: Int) : Base(p){}
          如果派生類沒有主構(gòu)造函數(shù),那么每個(gè)次級(jí)構(gòu)造函數(shù)必須使用super關(guān)鍵字初始化其基類型,或委托給另一個(gè)構(gòu)造函數(shù)做到這一點(diǎn),這種情況下不同的次級(jí)構(gòu)造函數(shù)可以基類型的不同的構(gòu)造函數(shù)
          class MyView : View {    
               constructor(ctx: Context) : super(ctx)     
               constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
          }
          覆蓋規(guī)則
          //對(duì)于可覆蓋的成員需要使用顯示修飾符open
             open class Rectangle {
                  open var length = 0
                  open fun draw() { /*.......*/
                  }
              }

              interface Polygon {
                  //接口中的成員默認(rèn)open
                  fun draw() { /*........*/
                  }
              }

              class Square() : Rectangle(), Polygon {
                  override fun draw() {
                      super<Rectangle>.draw() //調(diào)用Rectangle.draw()
                      super<Polygon>.draw() //調(diào)用Polygon.draw()
                  }
              }
          Kotlin中,如果一個(gè)類從它的直接超類集成相同成員的多個(gè)實(shí)現(xiàn),它必須覆蓋這個(gè)成員并提供其自己的實(shí)現(xiàn)。為了表示從哪個(gè)超類型繼承的實(shí)現(xiàn),使用由尖括號(hào)中超類型名稱限定super,例如super<Base>

          2.3 類的屬性

          2.3.1 getter與setter
          聲明屬性時(shí)是自動(dòng)生成的getter與setter,我們也可以自定義getter和setter
          val修飾的屬性只有g(shù)etter
          var age: Int = 11
                  get() {
                      return field
                  }
                  set(value) {
                      field = value + 1
                  }
          2.3.2 幕后字段
          下面的代碼會(huì)引起崩潰
          class Person {
              var name = ""
                  set(value) {
                      this.name = value
                  }
          }
          將上面代碼轉(zhuǎn)換成java
          public final class Person {
             
             private String name = "Paul";

             public final String getName() {
                return this.name;
             }

             public final void setName( String value) {
                this.setName(value);
             }
          }
          可以看到setName()被無限調(diào)用導(dǎo)致崩潰,可以使用幕后字段來解決
          在Kotlin中,如果屬性至少一個(gè)訪問器使用默認(rèn)實(shí)現(xiàn),那么Kotlin會(huì)自動(dòng)提供幕后字段,用關(guān)鍵字field表示,幕后字段主要用于自定義getter和setter中,并且只能在getter和setter中訪問。
          上面代碼應(yīng)該修改成
          class Person {
              var name = ""
                  set(value) {
                     filed = value
                  }
          }
          滿足下面條件之一的屬性擁有幕后字段:
          • 使用默認(rèn)getter/setter的屬性,一定有幕后字段。對(duì)于var屬性來說,只要getter/setter中有一個(gè)使用默認(rèn)實(shí)現(xiàn),就會(huì)生成幕后字段;
          • 在自定義getter/setter中使用了field的屬性。
          2.3.3 常量
          val的值并不是不可能變化的
          //每次獲取currentTimeMills都是不同的
          val currentTimeMills: Long
                  get() {
                      return System.currentTimeMillis()
                  }
          Kotlin中得到常量有兩種方式1.使用const 2使用@JvmField注解
           class Person {
              companion object{
                  //使用const修飾符
                  const val TAG = "Person"
              }

              //使用@JvmField注解方式 
              //其內(nèi)部原理是抑制編譯器生成相應(yīng)的getter方法并且無法重寫val的get方法
              @JvmField
              val TAG = "Person"
          }
          2.3.4 屬性延遲初始化
          一般地,屬性聲明為非空類型必須在構(gòu)造函數(shù)中初始化,可以用lateinit修飾符標(biāo)記該屬性使其可以延遲初始化,在初始化前訪問一個(gè)lateinit屬性會(huì)拋出異常

          2.4 內(nèi)部類

          Kotlin 的內(nèi)部類默認(rèn)為靜態(tài)內(nèi)部類,添加 inner 標(biāo)記后變?yōu)榉庆o態(tài)內(nèi)部類,能夠訪問外部類的成員,內(nèi)部類會(huì)帶有一個(gè)對(duì)外部類的對(duì)象的引用
          class Outer {
                  private val b: Int = 1
                 
                  inner class Inner {
                      fun foo(): Int = b
                  }
              }

              val d = Outer().Inner().foo() // ===1

          2.5 數(shù)據(jù)類

          數(shù)據(jù)類是Kotlin中用來保存數(shù)據(jù)的類,使用data關(guān)鍵字標(biāo)記,具有以下要求:
          • 主構(gòu)造函數(shù)至少有一個(gè)參數(shù)
          • 主構(gòu)造函數(shù)的參數(shù)需要顯示的標(biāo)記為val或者var
          • 數(shù)據(jù)類不能是抽象,開放,密封或者內(nèi)部的
          Tips:
          類中聲明的屬性在toString(),equals(),hashCode()以及copy()的實(shí)現(xiàn)中被排除
          data class Person(val name: String) {
              var age: Int = 0
          }

          fun foo() {
              val person1 = Person("John")
              val person2 = Person("John")
              person1.age = 10
              person2.age = 20
              //person1和person2雖然有不同的年齡但是會(huì)視為相等
              person1.equals(person2) //true
          }

          2.6 枚舉類

          Kotlin中枚舉類中每一個(gè)枚舉都是一個(gè)對(duì)象,并且之間用逗號(hào)分隔
              enum class Direction {
                  NORTH, SOUTH, WEST, EAST
               }

              enum class Color(val rgb: Int) {
                  RED(0xFF0000),
                  GREEN(0x00FF00),
                  BLUE(0x0000FF)
               }
          枚舉常量的匿名類
          • 要實(shí)現(xiàn)枚舉常量的匿名類,則必須提供一個(gè)抽象方法(必須重寫的方法)。且該方法定義在枚舉類內(nèi)部。而且必須在枚舉變量的后面。
          • 枚舉變量之間使用逗號(hào)(,)分割開。但是最后一個(gè)枚舉變量必須使用分號(hào)結(jié)束。不然定義不了抽象方法
          enum class Color(val rgb: Int) {
                  RED(0xFF0000) {
                      override fun print() {
                          print("red")
                      }
                  },
                  GREEN(0x00FF00) {
                      override fun print() {
                          print("green")
                      }
                  },
                  BLUE(0x0000FF) {
                      override fun print() {
                          print("blue")
                      }
                  };

                  abstract fun print()
              }

          fun main() {
                  Color.BLUE.print()
              }
          枚舉類的使用
          • 每個(gè)枚舉常量都包含兩個(gè)屬性:name(枚舉常量名)和ordinal(枚舉常量位置)
          • 提供了values()和valueOf()方法來檢測(cè)指定的名稱與枚舉類中定義的任何枚舉常量是否匹配。

          2.7 委托

          2.7.1 類委托
          一個(gè)標(biāo)準(zhǔn)類委托的實(shí)現(xiàn)如下:
          //創(chuàng)建接口
              interface Base {
                  fun print()
              }

              //實(shí)現(xiàn)此接口的被委托的類
              class BaseImpl(val x: Int) : Base {
                  override fun print() {
                      print(x)
                  }
              }

              //通過關(guān)鍵字by 建立委托類
              class Agent(b: Base) : Base by b

              fun main(args: Array<String>) {
                  val b = BaseImpl(1)
                  Agent(b).print() // 輸出 1 
              }
          Agent()接收一個(gè)Base實(shí)例,并通過by關(guān)鍵字與其建立委托關(guān)系。
          如果Agent()中覆蓋實(shí)現(xiàn)了print()方法,那么將使用覆蓋的實(shí)現(xiàn),而不是委托對(duì)象中的實(shí)現(xiàn)
          class Agent(b: Base) : Base by b {
                  override fun print() {
                      print("123")
                  }
              }
              
           fun main(args: Array<String>) {
                  val b = BaseImpl(1)
                  Agent(b).print() // 輸出 123 
            }
          2.7.2 屬性委托
          委托屬性的實(shí)現(xiàn)
          class Delegate {
                  operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
                      return "thank you for delegating '${property.name}' to me"
                  }

                  operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
                      print("$value has been assigned to '${property.name}'")
                  }
              }

          class Example {
                  var p: String by Delegate()
              }

           fun foo() {
                  val e = Example()
                  print(e.p)  // thank you for delegating 'p' to me

                  e.p = "new" // new has been assigned to 'p'
              }
          屬性name將它訪問器的邏輯委托給了Delegate對(duì)象,通過by關(guān)鍵字對(duì)表達(dá)式Delegate()求值獲取這個(gè)對(duì)象。任何符合屬性代理規(guī)則都可以使用by關(guān)鍵字。屬性代理類必須要遵循getValue(),setValue()方法約定,getValue、setValue方法可以是普通方法也可以是擴(kuò)展方法,并且是方法是支持運(yùn)算符重載。如果是val修飾的屬性只需要具備getValue()方法即可。
          屬性代理基本流程就是代理類中的getValue()方法包含屬性getter訪問器的邏輯實(shí)現(xiàn),setValue()方法包含了屬性setter訪問器的邏輯實(shí)現(xiàn)。當(dāng)屬性name執(zhí)行賦值操作時(shí),會(huì)觸發(fā)屬性setter訪問器,然后在setter訪問器內(nèi)部調(diào)用delegate對(duì)象的setValue()方法;執(zhí)行讀取屬性name操作時(shí),會(huì)在getter訪問器中調(diào)用delegate對(duì)象的getValue方法.
          介紹幾種常用的標(biāo)準(zhǔn)委托
          延遲屬性Lazy
          class LazySample {
                  val lazyStr: String by lazy {
                      print("init")
                      "123"
                  }
              }
              
           fun main(args:Array<String>){
                  val sample = LazySample()
                  print("lazy = ${sample.lazyStr}")
                  print("lazy = ${sample.lazyStr}")
              }
              // 輸出 
              // init 
              // lazy = 123  
              // lazy = 123
          屬性非空強(qiáng)校驗(yàn)
          var name: String by Delegates.notNull()

          fun init(name: String) {
                  this.name = name
              }

          fun main(args: Array<String>) {
                  val student = Student()
                  //初始化要在使用之前不然會(huì)報(bào)異常->IllegalStateException
                  student.init("張三")
                  print(student.name)
              }
          可觀察屬性
          private var name: String by Delegates.observable("oldValue") { property, oldValue, newValue ->
                  print("${property.name} 屬性變化: $oldValue -> $newValue")
              }

              private var age: Int by Delegates.observable(0) { property, oldValue, newValue ->
                  print("${property.name} 屬性變化: $oldValue -> $newValue")
              }

              private fun print() {
                  print("name = $name")
                  print("age = $age")
              }

              fun main(args: Array<String>) {
                  print()
                  name = "Bob"
                  age = -1 //小于0,修改失敗
                  print()
                  age = 28
                  print()
              }

              /*
              * name = oldValue
              * age = 0
              * name 屬性變化: oldValue -> Bob
              * age 屬性變化: 0 -> -1
              * name = Bob
              * age = 0
              * age 屬性變化: 0 -> 28
              * name = Bob
              * ag

          三.函數(shù)


          3.1 局部函數(shù)

          Kotlin支持局部函數(shù),即一個(gè)函數(shù)在另一個(gè)函數(shù)內(nèi)部,局部函數(shù)可以訪問外部函數(shù)(即閉包)的局部變量
           fun outer(str: String) {
                  fun inner(index: Int) {
                      str.substring(0, index)
                  }
                  inner(2)
              }

          3.2 函數(shù)類型

          Kotlin中使用類似 (Int) -> String 的一系列函數(shù)類型來處理函數(shù)的聲明
          • 所有函數(shù)類型都有一個(gè)圓括號(hào)括起來的參數(shù)類型列表以及一個(gè)返回類型:(A, B) -> C 表示接受類型分別為 A 與 B 兩個(gè)參數(shù)并返回一個(gè) C 類型值的函數(shù)類型
          • 函數(shù)類型可以有一個(gè)額外的接收者類型,它在表示法中的點(diǎn)之前指定:類型 A.(B) -> C 表示可以在 A 的接收者對(duì)象上以一個(gè) B 類型參數(shù)來調(diào)用并返回一個(gè) C 類型值的函數(shù).
          • 掛起函數(shù)屬于特殊種類的函數(shù)類型,它的表示法中有一個(gè) suspend 修飾符 ,例如 suspend () -> Unit 或者 suspend A.(B) -> C
          • 函數(shù)類型可以使用圓括號(hào)進(jìn)行接合:(Int) -> ((Int) -> Unit)
          • 箭頭表示法是右結(jié)合的,(Int) -> (Int) -> Unit 與(Int) -> ((Int) -> Unit)等價(jià),但不等于 ((Int) -> (Int)) -> Unit。
          • typealias ClickHandler = (Button, ClickEvent) -> Unit 通過使用類型別名給函數(shù)類型起一個(gè)別稱
          //(A,B) -> C
              val fun1: (String, String) -> Unit = { s1, s2 ->
                  print("$s1 and $s2")
              }

              //A.(B) -> C
              val fun2: String.(String) -> Unit = { s ->
                  print("$this $s")
              }

              fun foo() {
                  fun1("123""456")
                  fun1.invoke("123""456")

                  fun2("123""456")
                  fun2.invoke("123""456")
                  "123".fun2("456")
              }

          3.3 Lambda表達(dá)式

          Lambda表達(dá)式總是在花括號(hào)中,參數(shù)聲明放在花括號(hào)內(nèi),并有可選的類型標(biāo)注,函數(shù)體跟在一個(gè)->符號(hào)之后,如果推斷出的該Lambda的返回類型不是Unit,那么最后一個(gè)表達(dá)式會(huì)視為返回值。

          val sum = { x: Int, y: Int -> x + y }
          如果函數(shù)作為最后一個(gè)參數(shù),那么相應(yīng)的參數(shù)傳入的Lambda表達(dá)式可以放到圓括號(hào)之外,這種語法稱為拖尾lambda表達(dá)式,如果是lambda表達(dá)式作為調(diào)用時(shí)的唯一參數(shù),那么圓括號(hào)可以完全省略
          fun sum(m: Int, n: Int, param: (x: Int, y: Int) -> Int): Int {
                  return param.invoke(m, n)
              }

          fun main(args: Array<String>) {
                  sum(1, 2) { x, y -> x + y }
            }
          lambda表達(dá)式的參數(shù)未使用的情況下,可以用下劃線取代其名稱
          fun sum(m: Int, n: Int, param: (x: Int, y: Int) -> Int): Int {
                  return param.invoke(m, n)
              }

          fun main(args: Array<String>) {
                  sum(1, 2) { x, _ -> x + 10 }
            }

          3.4 匿名函數(shù)

          匿名函數(shù)區(qū)別于lambda表達(dá)式的不同點(diǎn)是,可以顯示的指定返回值類型。
          fun(x: Int, y: Int): Int = x + y
          如果應(yīng)用中需要顯示的指定返回值類型,可以使用匿名函數(shù)

          3.5 高階函數(shù)

          高階函數(shù)是獎(jiǎng)函數(shù)用作參數(shù)或者返回值的函數(shù)
          fun sum(m: Int, n: Int, param: (x: Int, y: Int) -> Int): Int {
                  return param.invoke(m, n)
              }

          fun main(args: Array<String>) {
                  //函數(shù)類型作為參數(shù)
                  val param: (x: Int, y: Int) -> Int = { x, y -> x + y }
                  sum(1, 2, param)
              }
              
          fun sum(): (x: Int, y: Int) -> Int {
                  return { x, y -> x + y }
              }

              fun main(args: Array<String>) {
                  //函數(shù)類型作為返回值類型
                  sum().invoke(1, 2)
              }    

          3.6 中綴表示法

          標(biāo)有infix關(guān)鍵字的函數(shù)也可以使用中綴表示法調(diào)用。中綴函數(shù)必須滿足以下要求:
          • 它們必須是成員函數(shù)或擴(kuò)展函數(shù);
          • 它們必須只有一個(gè)參數(shù);
          • 其參數(shù)不得接受可變數(shù)量的參數(shù)且不能有默認(rèn)值。
           infix fun Int.sum(x: Int): Int {
                  return 1
              }

           fun main(args: Array<String>) {
                  //用中綴表示法調(diào)用該函數(shù)
                  1 sum 2
                  //等同于調(diào)用
                  1.sum(2)
             }

          3.7 內(nèi)聯(lián)函數(shù)

          使用高階函數(shù)會(huì)帶來一些運(yùn)行時(shí)的效率損失:每一個(gè)函數(shù)都是一個(gè)對(duì)象,并且會(huì)捕獲一個(gè)閉包。即那些在函數(shù)體內(nèi)會(huì)訪問到的變量。內(nèi)存分配(對(duì)于函數(shù)對(duì)象和類)和虛擬調(diào)用會(huì)引入運(yùn)行時(shí)間開銷。
          inline 修飾符影響函數(shù)本身和傳給它的 lambda 表達(dá)式:所有這些都將內(nèi)聯(lián)到調(diào)用處。
          fun main(args: Array<String>) {
                  print("start")
                  show("123")
                  print("end")
              }

          inline fun show(str: String) {
                  print(str)
              }
          轉(zhuǎn)換成java代碼后
           public final void main(@NotNull String[] args) {
                System.out.print("start");
                System.out.print("123");
                System.out.print("end");
             }

             public final void show(@NotNull String str) {
                System.out.print(str);
             }
          不帶inline修飾時(shí)
           public final void main(@NotNull String[] args) {
                System.out.print("start");
                this.show("123")
                System.out.print("end");
             }

             public final void show(@NotNull String str) {
                System.out.print(str);
             }
          一般情況下當(dāng)對(duì)于帶有l(wèi)ambda參數(shù)的函數(shù),建議使用inline進(jìn)行修飾。

          3.8 標(biāo)準(zhǔn)庫函數(shù)

          最后介紹幾種標(biāo)準(zhǔn)庫函數(shù)。
          函數(shù)名稱定義功能
          run        public inline funrun(block: () -> R): R = block()                                                               調(diào)用run函數(shù)塊。返回值為函數(shù)塊最后一行,或者指定return表達(dá)式
          apply           public inline funT.apply(block: T.() -> Unit): T { block(); return this }調(diào)用某對(duì)象的apply函數(shù),在函數(shù)塊內(nèi)可以通過 this 指代該對(duì)象。返回值為該對(duì)象自己
          let          public inline fun <T, R> T.let(block: (T) -> R): R = block(this)調(diào)用某對(duì)象的let函數(shù),則該對(duì)象為函數(shù)的參數(shù)。在函數(shù)塊內(nèi)可以通過 it 指代該對(duì)象。返回值為函數(shù)塊的最后一行或指定return表達(dá)式
          alsopublic inline funT.also(block: (T) -> Unit): T { block(this); return this }調(diào)用某對(duì)象的also函數(shù),則該對(duì)象為函數(shù)的參數(shù)。在函數(shù)塊內(nèi)可以通過 it 指代該對(duì)象。返回值為該對(duì)象自己
          withpublic inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()將某對(duì)象作為函數(shù)的參數(shù),在函數(shù)塊內(nèi)可以通過 this 指代該對(duì)象。返回值為函數(shù)塊的最后一行或指定return表達(dá)式

          總結(jié)

          以上是結(jié)合實(shí)例對(duì)從三個(gè)方面對(duì)Kotlin的基礎(chǔ)應(yīng)用介紹。相對(duì)來講函數(shù)相關(guān)的知識(shí)點(diǎn)是比較重要的,函數(shù)作為Kotlin中的一等公民,可以作為參數(shù)或者返回值,也是Kotlin的一大特點(diǎn)。我們更需要去深入了解其中的原理并在應(yīng)用中靈活應(yīng)用,這樣能起到事半功倍的效果。

          —  —

          點(diǎn)這里??關(guān)注我,記得標(biāo)星呀~


          前線推出學(xué)習(xí)交流一定要備注:研究/工作方向+地點(diǎn)+學(xué)校/公司+昵稱(如JAVA+上海

          掃碼加小編微信,進(jìn)群和大佬們零距離



          END


          后臺(tái)回復(fù)“電子書” “資料” 領(lǐng)取一份干貨,數(shù)百面試手冊(cè)等你
          開發(fā)者技術(shù)前線 ,匯集技術(shù)前線快訊和關(guān)注行業(yè)趨勢(shì),大廠干貨,
          是開發(fā)者經(jīng)歷和成長(zhǎng)的優(yōu)秀指南。

          好文點(diǎn)個(gè)在看吧!
          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  少妇无套内谢太紧了一区 | 在线免费观看亚洲a | 青娱乐亚洲领先精品 | 乱伦AV中文字幕 | 免费看黄色视频在线观看 |