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

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

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

我需要每个项目的例子。 请不要发布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