让我们也来申请,如果在Kotlin拿走了一些未知的东西
我读了许多关于这些项目的Kotlin文件。 但是我不太清楚。
Kotlin的用途是什么, 还有 , 如何 取得细节?
我需要每个项目的例子。 请不要发布Kotlin文档。 我需要一个实时的例子和这些项目的用例。
让
public inline fun
将接收器传递给作为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
执行与接收器一起传递的函数作为参数并返回接收器 。
这就像让,但总是返回接收器 ,而不是函数的结果。
你可以使用它来做一个对象的东西。
val person = Person().also { println("Person ${it.name} initialized!") // Do what you want here... }
takeIf
public inline fun
如果函数(谓词)返回true,则返回接收者 ,否则返回null。
println(myVar.takeIf { it is Person } ?: "Not a person!")
takeUnless
public inline fun
和takeIf
,但谓词颠倒了。 如果为true,则返回null,否则返回接收者 。
println(myVar.takeUnless { it is Person } ?: "It's a person!")
帮帮我
- 您可以使用https://try.kotlinlang.org/轻松进行测试。 你可以在这里find例子。
- 你可以在这里签出标准库的源代码。
let
在这里takeIf
,takeUnless
。
让我们也同样适用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解释@Configuration @AutoConfigureAfter
- 如何使用Gradle建立Google协议缓冲区和Kotlin?
- 使用kotlin-stdlib 1.1.51,但加载了kotlin-runtime 1.3
- 将数据从PendingIntent(AlarmManager)传递给BroadcastReceiver
- kotlin反映和vararg
- IndexOutOfBoundsException for Kotlin for循环
- Kotlin:由于textView,Android应用程序意外停止
- Retrofit-Vertx在Kotlin中使用RxJava2 IllegalStateException消息== null
- 连续动画在TornadoFX?