让我们也来申请,如果在Kotlin拿走了一些未知的东西

我读了许多关于这些项目的Kotlin文件。 但是我不太清楚。

Kotlin的用途是什么, 还有如何 取得细节?

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

    2 Solutions collect form web for “让我们也来申请,如果在Kotlin拿走了一些未知的东西”

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

    接收器传递给作为parameter passing的函数。 返回函数的结果。

     val myVar = "hello!" myVar.let { println(it) } // Output "hello!" 

    你可以使用let来进行null安全检查:

     val myVar = if (Random().nextBoolean()) "hello!" else null myVar?.let { println(it) } // Output "hello!" only if myVar is not null 

    public inline fun T.also(block: (T) -> Unit): T { block(this); return this }

    执行与接收器一起传递的函数作为参数并返回接收器
    这就像让,但总是返回接收器 ,而不是函数的结果。

    你可以使用它来做一个对象的东西。

     val person = Person().also { println("Person ${it.name} initialized!") // Do what you want here... } 

    takeIf

    public inline fun T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null

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

     println(myVar.takeIf { it is Person } ?: "Not a person!") 

    takeUnless

    public inline fun T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null

    takeIf ,但谓词颠倒了。 如果为true,则返回null,否则返回接收者

     println(myVar.takeUnless { it is Person } ?: "It's a person!") 

    帮帮我

    • 您可以使用https://try.kotlinlang.org/轻松进行测试。 你可以在这里find例子。
    • 你可以在这里签出标准库的源代码。 let 在这里 takeIftakeUnless

    让我们也同样适用takeIf,取非是Kotlin的扩展function。

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

    扩展function:

    通过使用扩展function,我们可以为一个类创建一个function,而不需要inheritance一个类。

    Kotlin类似于C#和Gosu,它提供了扩展一个具有新function的类的能力,而不必从类inheritance或使用任何types的设计模式,例如装饰器。 这是通过称为扩展的特殊声明完成的。 Kotlin支持扩展function和扩展属性。

    因此,要查找String是否只有数字,您可以创建一个如下所示的方法,而不inheritanceString类。

     fun String.isNumber(): Boolean = this.matches("[0-9]+".toRegex()) 

    你可以使用上面这样的扩展函数

     val phoneNumber = "8899665544" println(phoneNumber.isNumber) 

    这是打印true

    Lambda函数:

    Lambda函数就像Java中的Interface一样。 但是在Kotlin中,lambda函数可以作为函数的parameter passing。

    例:

     fun String.isNumber(block: () -> Unit): Boolean { return if (this.matches("[0-9]+".toRegex())) { block() true } else false } 

    你可以看到,该块是一个lambda函数,它作为parameter passing。 你可以像这样使用上面的函数,

     val phoneNumber = "8899665544" println(phoneNumber.isNumber { println("Block executed") }) 

    上面的函数会打印这样的,

     Block executed true 

    我希望现在您了解了扩展函数和Lambda函数。 现在我们可以一个接一个地去扩展function。

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

    在上面的函数中使用了T和R两种types。

     T.let 

    T可以是任何像String类的对象。 所以你可以用任何对象调用这个函数。

     block: (T) -> R 

    在参数let中,可以看到上面的lambda函数。 而且,调用对象作为函数的parameter passing。 所以你可以使用函数内的调用类对象。 那么它返回R (另一个对象)。

    例:

     val phoneNumber = "8899665544" val numberAndCount: Pair = phoneNumber.let { it.toInt() to it.count() } 

    在上面的例子中,let将String作为其lambda函数的参数,并返回Pair

    同样,其他扩展function也可以工作。

     public inline fun  T.also(block: (T) -> Unit): T { block(this); return this } 

    扩展函数also将调用类作为lambda函数参数并不返回任何内容。

    例:

     val phoneNumber = "8899665544" phoneNumber.also { number -> println(number.contains("8")) println(number.length) } 

    应用

     public inline fun  T.apply(block: T.() -> Unit): T { block(); return this } 

    同样也是相同的调用对象作为函数传递,所以你可以使用函数和其他属性,而无需调用它或参数名称。

    例:

     val phoneNumber = "8899665544" phoneNumber.apply { println(contains("8")) println(length) } 

    在上面的例子中你可以看到在lambda函数中直接调用的String类的function。

    takeIf

     public inline fun  T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null 

    例:

     val phoneNumber = "8899665544" val number = phoneNumber.takeIf { it.matches("[0-9]+".toRegex()) } 

    在上面的例子中, number将只有一个phoneNumber字符串,只匹配regex 。 否则,它将是null

    takeUnless

     public inline fun  T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null 

    这是takeIf的反面。

    例:

     val phoneNumber = "8899665544" val number = phoneNumber.takeIf { it.matches("[0-9]+".toRegex()) } 

    number只有与regex不匹配时才会有一个phoneNumber字符串。 否则,它将是null

    Kotlin language will be the best programming language for Android.