Kotlin学习(4)-标准库函数(8个常见函数)

apply():可以看做是一个配置函数,传入一个接收者,然后调用一系列方法配置它以便使用,最后返回配置好的接收者

fun main() {

    //常规写法
    val file1 = File("D://file.txt")
    file1.setExecutable(true)
    file1.setReadable(true)
    file1.setWritable(true)
    
    //使用apply函数来完成上述操作 并返回apply
    //调用一个个函数时,变量名被省略掉了,因为在lambda表达式里,apply能让每个配置函数都
    //作用于接收者,这种行为又叫做 相关作用域
    val apply:File = file1.apply {
        setExecutable(true)
        setReadable(true)
        setWritable(true)
    }
}
复制代码

let():let函数使某个变量作用于其Lambda表达式里,让it关键字能引用它,与apply比较,let会把接收者传给lambda,而apply什么都不传。匿名函数执行完,apply会返回当前接收者,let会返回lambda的最后一行

    val result = listOf(1, 2, 3).first().let {
        //返回1*1
        it * it
    }
复制代码
//结合空安全操作符
fun formatGreeting(guestName: String?): String {
    return guestName?.let {
        "welcome $it"
    } ?: "who are you"
}
复制代码

run():run不返回接收者,返回的是lambda的结果

    val file1 = File("D://file.txt")
    val run = file1.run {
        //readText()一次性读取文件内容
        readText().contains("abc")
    }
    
    var str = "abcdefghijklmn"
    str.run { 
        //判断长度是否大于10 并返回
        length>10
    }
复制代码

run函数支持链式调用

var str = "abcdefghijklmn"
//使用 函数引用 链式调用的过程是
//1.执行isLong函数
//2.将第一步的结果传给showMessage函数
//3.将第二步的结果传给print函数打印
str.run(::isLong).run(::showMessage).run(::print)

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

fun showMessage(isLong: Boolean): String {
    return if (isLong) {
        "Too Long"
    } else {
        return "not too long"
    }
}
复制代码

with():with是run函数的变体,with的调用方式不同,调用with时需要 值参作为其第一个参数传入

    //使用with判断长度大于10
    with(str){
        length>10
    }
复制代码

also():also函数和let函数功能相似,和let一样,also把接收者作为值参传给lambda,但是有一点不同:also返回接收者对象,而let返回lambda结果

利用这个差异,also适合针对同一原始对象,利用副作用做事,also返回接收者对象,就可以基于原始接收者对象执行额外的链式调用

    //声明一个String集合
    var fileContents:List<String>
    File("D://file.txt").also { 
        //打印文件名
        print(it.name)
    }.also { 
        //将文件的字符串添加到集合中
        fileContents = it.readLines()
    }
    println(fileContents)
复制代码

takeIf():takeIf需要判断lambda中提供的条件表达式,给出true、false结果,如果判断为true,从takeIf函数返回接收者对象,如果是false,则返回null。如果需要判断某个条件是否满足,再决定是否可以赋值变量或者执行某项任务,takeIf就非常有用

    val readResult:String = File("D://file.txt").takeIf {
        //文件存在并且可以读
        it.exists() && it.canRead()
        
        //读文件
    }?.readText() ?: "null"
    
    print(readResult)
复制代码

takeUnless():是takeIf的辅助函数,只有判断你给定的条件结果是false时,takeUnless才会返回原始接收者对象

    File("D://file.txt").takeUnless {
        //文件隐藏 不可见
        it.isHidden
        //读文件
    }?.readText() ?: "null"
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享