本文适合已经了解Kotlin基本用法,想更加深入的使用Kotlin方法和性能的同学们
如果你是Kotlin小白,可以先了解一下Kotlin的基础用法
解构声明
我们在一个文件中定义一个Person类
data class Person(val name: String, val age: Int)
我们可以通过简单的语法获得这个类的name和age属性
val (name, age) = Person("tom", 11)
println(name)
println(age)
上面的Person是数据类(data class)当我们定义一个普通的类,不能简单的通过下面的方法获取name和age的值
class Dog(val name: String, val age: Int)
val (nameDog, ageDog) = Dog("James", 5)
为什么数据类可以,普通类就不可以呢? 因为数据类帮我们实现了解构声明需要的componentN方法这个N可以是1或者2等.
标准库中的let, takeIf, takeUnless,apply, also,with,run方法
let
let方法接收一个参数,参数是个方法。这个方法的名字叫block。let接收的方法是一个穿入值是T类型返回值是R类型的方法。并且我们知道这个方法的反回值就是整个let方法的返回值。绕口,见谅
// Java
if (message != null) {
System.out.println(message)
}
// Kotlin 如果message是null下面这行忽略
message?.let {
println(it) }
takeIf
定义
/**
* Returns `this` value if it satisfies the given [predicate] or `null`, if it doesn't.
*/
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
- takeIf是个扩张方法
- 参数是个方法,(T) -> Boolean,这个方法的参数是类型T的对象,返回值是一个布尔类型
- if (predicate(this)) this else null,这个是方法体。通过predicate这个函数为真,返回对象T,要么返回null
举例
val result = "Hello World".takeIf {
it.length > 1
}
println(result)
//打印结果System.out: Hello World
takeUnless
定义上看,takeIf和takeUnless只是在方法体中的if的判断相反,其他都一样。
/**
* Returns `this` value if it _does not_ satisfy the given [predicate] or `null`, if it does.
*/
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null
apply
apply函数是这样的,调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象
fun testApply() {
// fun <T> T.apply(f: T.() -> Unit): T { f(); return this }
ArrayList<String>().apply {
add("testApply")
add("testApply")
add("testApply")
println("this = " +