Kotlin 标准库函数

Kotlin 标准库函数

apply

说明:可以当做配置函数,可以在其 lambda 中直接执行调用者的内部函数,方便对其进行配置,且会返回配置好的调用者。

示例代码:

import java.io.File
//对 file 设置可读写
fun main(){
    //不使用 apply
    val file = File("path")
    file.setReadable(true)
    file.setWritable(true)
    file.setExecutable(false)

    //使用 apply
    val file = File("path").apply{
        setReadable(true)
        setWritable(true)
        setExecutable(false)
    }
}

let

说明:let 可以将调用者传入其 lambda 中,使用 it 来代表调用者,且 let 会返回 lambda 的最后一行。

示例代码:

// 计算集合中第一个数的平方值
fun main(){
    // 不使用 let
    val firstElement = listOf(3,2,2).first()
    val result = firstElement * firstElement

    // 使用 let
    val resutl = listOf(3,2,1).let{
        it * it
    }
}

run

说明:run 函数基本上跟 apply 函数相似,只是在返回值上有所不同,run 不返回调用者,返回的是 lambda 的结果,也就是 true 或者 false。

示例代码:

import java.io.File
// 判断 file 中是否包含指定字符串
fun main(){
    //不使用 run
    val file = File("path")
    val fileContent = file.readText()
    val containsResult = fileContent.contains("great")

    //使用 run
    val file = File("path")
    val containsResult = file.run{
        readText().contains("great")
    }
}

扩展使用:

说明:run 函数也可以执行函数引用

示例代码:

fun main(){
    "Benjamin"
        .run(::isLong)
        .run(::showMessage)
        .run(::println)
}

fun isLong(name: String) = name.length >= 5

fun showMessage(isLong: Boolean){
    return if(isLong){
        "Name is too long."
    }else{
        "Please rename."
    }
}

with

说明:with 在功能上与 run 函数一样,区别只是在调用方式上,with 是将调用者作为自己的参数传递进来的。

示例代码:

run main(){
    val resutl = with("Benjamin"){
        lenth >= 10
    }
}

also

说明:also 的功能上同 let 一样,都是将调用者传递到 lambda 中,不同点是在返回值上,let 返回的是 lambda 的结果,而 also 的返回值是调用者。针对这个特点,also 就非常适合用在针对同一对象的连续调用上,比如:链式调用

示例代码:

import java.io.File

fun main(){
    var fileContent = ""
    File("path")
        .also{
            print(it.name)
        }.also{
            fileContent = it.readContent()
        }
    println(fileContent)
}

takeIf

说明:takeIf 从功能上说有点类似于 if,需要根据其 lambda 中的表达式结果来决定返回值是什么,当lambda 中的表达式结果是 true 时,返回的是调用者,反之返回的是 null。

示例代码:

import java.io.File

fun main(){
    val fileContent = File("path").takeIf{
        it.canRead() && it.canWrite()    
    }?.readContent()
}

takeUnless

说明:跟 takeIf 相反,只有 lambda 中的返回值是 false 时,才会返回调用者对象,否则返回 null 。

示例代码:

import java.io.File

fun main(){
    val fileContent = File("path").takeUnless{
        it.isHidden
    }?.readContent()
}