Kotlin标准库函数

本文最后更新于:2022年11月30日 晚上

标准库函数

apply

apply函数可看作一个配置函数,你可以传入一个接收者,然后调用一系列配置以便它使用,如果提供lambda给apply函数执行,它会返回配置好的接收者。

fun main() {
    // 配置一个File实例
    val file1 = File("E://demo.txt")
    file1.setReadable(true)
    file1.setWritable(true)
    file1.setExecutable(false)
    // 使用apply
    val file2 = File("E://demo.txt").apply {
        // 这里可以省略this
        // 所有操作默认接收者为file2
        // 这也叫隐式调用
        setReadable(true)
        setWritable(true)
        setExecutable(false)
    }
}

let

和上面apply差不多,但是会返回lambda函数的最后一行的结果,并赋值给接收者,但是不支持隐式调用。

fun main() {
    // 求集合第一个元素的平方
    val res = listOf(8, 6, 9).first().let {
        it * it
    }
    println(res)
    // 不用let
    val firstElement = listOf(8, 6, 9).first()
    val res2 = firstElement * firstElement
    println(res2)
}

配合安全操作符使用。

fun main() {
    println(formatGreeting(null)) // What's your name?
    println(formatGreeting("Yorick")) // Hello! Yorick.
    println(formatGreeting1(null)) // What's your name?
    println(formatGreeting1("Yorick")) // Hello! Yorick.
}
// 使用let进行链式调用
fun formatGreeting(guestName: String?): String {
    return guestName?.let {
        "Hello! $it."
    } ?: "What's your name?"
}
// 传统方式
fun formatGreeting1(guestName: String?): String {
    return if (guestName != null) {
        "Hello! $guestName."
    } else {
        "What's your name?"
    }
}

run

结合了let和apply,可以像let一样返回lambda最后一行结果,同时可以像apply一样隐式调用。

// 判断文件是否包含某字符
fun main() {
    val file = File("E://demo.txt")
    val res = file.run {
        readText().contains("demo")
    }
    println(res) // true
}

另外,run也能用来执行函数引用

fun main() {
    //::表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。
    "The People's Republic of China"
        .run(::isLong)
        .run(::showMessage)
        .run(::println)
}

fun isLong(str: String) = str.length >= 10

fun showMessage(isLong: Boolean): String {
    return if (isLong) {
        "String is too long!"
    } else {
        "OK!"
    }
}
// 输出
// String is too long!

with

with函数是run的变体,他们的功能行为是一样的,但with的调用方式不同,调用with时需要值参作为其第一个参数传入。

fun main() {
    // 使用run
    val res1 = "The People's Republic of China".run {
        length > 10
    }
    println(res1)
    // 使用with
    val res2 = with("The People's Republic of China") {
        length > 10
    }
    println(res2)
}
// 输出
// true
// true

also

和let相似,把接收者传给lambda,但是返回的是原始对象,常用于链式调用。

fun main() {
    val fileContents: List<String>
    File("E://demo.txt")
        .also {
            println(it.name)
        }.also {
            fileContents = it.readLines()
        }
    println(fileContents)
}
// 输出示例
// demo.txt
// [demo, demo, hhhh, edited by Yorick, 2022年9月8日11点32分]

takeIf

类似if,判断接收者是否满足lambda的表达式,满足返回接收者,不满足则返回null。

fun main() {
    val res = File("E://demo.txt")
        .takeIf { it.exists() && it.canRead() }
        ?.readText()
    println(res)
}
// 输出文件内容

takeUnless

takeIf的否定,false才返回对象,true返回null

fun main() {
    val res = File("E://demo.txt")
        .takeUnless { it.isHidden }
        ?.readText()
    println(res)
}

Kotlin标准库函数
https://yorick-ryu.github.io/Kotlin/Kotlin标准库函数/
作者
Yorick
发布于
2022年9月8日
许可协议