Android kotlin之间的区别还有,在kotlin中,apply、let、use、takeIf和take除非
我读了很多关于这些项目的Kotlin文件。但我不太明白 Kotlinlet、也、takeIf和takeexcel的具体用途是什么 我需要每个项目的一个例子。请不要发布Kotlin文档。我需要这些项目的实时示例和用例。letAndroid 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
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