Android kotlin之间的区别还有,在kotlin中,apply、let、use、takeIf和take除非

Android kotlin之间的区别还有,在kotlin中,apply、let、use、takeIf和take除非,android,kotlin,extension-function,Android,Kotlin,Extension Function,我读了很多关于这些项目的Kotlin文件。但我不太明白 Kotlinlet、也、takeIf和takeexcel的具体用途是什么 我需要每个项目的一个例子。请不要发布Kotlin文档。我需要这些项目的实时示例和用例。let public-inline-fun T.let(block:(T)->R):R=block(this) 获取接收器并将其传递给作为参数传递的函数。返回函数的结果 val myVar = "hello!" myVar.let { println(it) } // Output

我读了很多关于这些项目的Kotlin文件。但我不太明白

KotlinlettakeIftakeexcel的具体用途是什么

我需要每个项目的一个例子。请不要发布Kotlin文档。我需要这些项目的实时示例和用例。

let
public-inline-fun T.let(block:(T)->R):R=block(this)

获取接收器并将其传递给作为参数传递的函数。返回函数的结果

val myVar = "hello!"
myVar.let { println(it) } // Output "hello!"
您可以使用
let
进行空安全检查:

val myVar = if (Random().nextBoolean()) "hello!" else null
myVar?.let { println(it) } // Output "hello!" only if myVar is not null
public inline fun T.allow(block:(T)->Unit):T{block(this);返回this}

执行接收器作为参数传递的函数,并返回接收器。
它就像let,但总是返回接收器,而不是函数的结果

T.let
您可以使用它在对象上执行某些操作

val person = Person().also {
  println("Person ${it.name} initialized!")
  // Do what you want here...
}
武夫
public内联fun T.takeIf(谓词:(T)->布尔值):T?=if(谓词(this))this else为空

如果函数(谓词)返回true,则返回接收方,否则返回null

println(myVar.takeIf { it is Person } ?: "Not a person!")
武装分子
public-inline-fun T.take除非(谓词:(T)->Boolean):T?=如果(!谓词(this))此else为空

takeIf
相同,但谓词颠倒。如果为true,则返回null,否则返回接收方

帮助
  • 您可以使用它轻松地进行测试。你可以找到例子
  • 您可以签出标准库的源代码<代码>让,
    接受如果
    接受除非

    • let、apply、takeIf、takeexcept也是Kotlin中的扩展函数

      要理解这些函数,您必须理解Kotlin中的扩展函数和Lambda函数

      扩展功能:

      通过使用扩展函数,我们可以在不继承类的情况下为类创建函数

      Kotlin类似于C#和Gosu,提供了扩展类的能力 使用新功能而不必从类继承或使用 任何类型的设计模式,如Decorator。这是通过特殊方式完成的 声明称为扩展。Kotlin支持扩展功能 和扩展属性

      因此,要查找
      字符串中是否只有数字
      ,可以创建如下方法,而无需继承
      字符串

      fun String.isNumber(): Boolean = this.matches("[0-9]+".toRegex())
      
      您可以像这样使用上述扩展功能

      val phoneNumber = "8899665544"
      println(phoneNumber.isNumber())
      
      val phoneNumber = "8899665544"
      phoneNumber.isNumber {
         println("Block executed")
      }
      
      Block executed
      
      这是打印
      true

      Lambda函数:

      Lambda函数就像Java中的接口(只包含一个方法,也称为单一抽象方法)。Java 8中的lambda也有Java版本。在科特林,兰达斯无处不在。大多数情况下,lambda在函数中作为参数传递

      T.let
      
      例如:

      fun String.isNumber(block: () -> Unit): Boolean {
          return if (this.matches("[0-9]+".toRegex())) {
              block()
              true
          } else false
      }
      
      val phoneNumber = "8899665544"
      val numberAndCount: Pair<Int, Int> = phoneNumber.let { it.toInt() to it.count() }
      
      val phoneNumber = "8899665544"
      phoneNumber.also { number ->
          println(number.contains("8"))
          println(number.length)
       }
      
      val phoneNumber = "8899665544"
      phoneNumber.apply { 
          println(contains("8"))
          println(length)
       }
      
      val phoneNumber = "8899665544"
      val number = phoneNumber.takeIf { it.matches("[0-9]+".toRegex()) }
      
      val phoneNumber = "8899665544"
      val number = phoneNumber.takeUnless { it.matches("[0-9]+".toRegex()) }
      
      您可以看到,该块是一个lambda函数,它作为参数传递。您可以像这样使用上述函数

      val phoneNumber = "8899665544"
      println(phoneNumber.isNumber())
      
      val phoneNumber = "8899665544"
      phoneNumber.isNumber {
         println("Block executed")
      }
      
      Block executed
      
      上面的函数将这样打印

      val phoneNumber = "8899665544"
      println(phoneNumber.isNumber())
      
      val phoneNumber = "8899665544"
      phoneNumber.isNumber {
         println("Block executed")
      }
      
      Block executed
      
      我希望,现在您已经了解了扩展函数和Lambda函数。现在我们可以一个接一个地讨论扩展函数

      public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
      
      T
      可以是任何对象,如字符串、数字或任何类型。因此,您可以使用任何对象调用此函数

      block: (T) -> R
      
      您可以在函数的参数中看到lambda函数,让调用对象作为函数的参数传递。因此,您可以在函数中使用调用类对象。然后返回
      R
      (另一个对象)

      例如:

      fun String.isNumber(block: () -> Unit): Boolean {
          return if (this.matches("[0-9]+".toRegex())) {
              block()
              true
          } else false
      }
      
      val phoneNumber = "8899665544"
      val numberAndCount: Pair<Int, Int> = phoneNumber.let { it.toInt() to it.count() }
      
      val phoneNumber = "8899665544"
      phoneNumber.also { number ->
          println(number.contains("8"))
          println(number.length)
       }
      
      val phoneNumber = "8899665544"
      phoneNumber.apply { 
          println(contains("8"))
          println(length)
       }
      
      val phoneNumber = "8899665544"
      val number = phoneNumber.takeIf { it.matches("[0-9]+".toRegex()) }
      
      val phoneNumber = "8899665544"
      val number = phoneNumber.takeUnless { it.matches("[0-9]+".toRegex()) }
      
      应用

      public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
      
      在上面的示例中,您可以看到在lambda函数中直接调用String类的函数

      takeIf

      public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
      
      在上面的示例中,
      number
      将有一个
      phoneNumber
      字符串,只有它与
      regex
      匹配。否则,它将为
      null

      take除非

      public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null
      
      number
      只有在与
      regex
      不匹配时才会有一个
      phoneNumber
      字符串。否则,它将为
      null