kotlin的函数标准库使用

摘要说明

函数标准库常用的有:

1、apply

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

使用介绍:

java 复制代码
    // 使用apply实现
    val file1 = File("E://text_demo.txt").apply {
        setReadable(true)
        setWritable(true)
        setExecutable(false)
    }

2、let

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

使用介绍:

java 复制代码
    /**
     * let使用
     */

    val result = listOf<Int>(3, 2, 1).first().let {
        it * it
    }
    输出结果:9
-----------------------------------------------------------
fun formatGreeting(guestName: String?): String {
    return guestName?.let {
        "Welcome, $it"
    } ?: "what's your name?"
}

formatGreeting(null)
输出结果:what's your name?

----------------------------------------------------------
说明:安全调用允许在可空类型上调用函数
var str: String = "butterfly"

    str = str.let {
        if (it.isNotBlank()) {
            it.capitalize().plus("你好")
        } else {
            "butterfly"
        }
    }
    println(str)

输出结果:Butterfly你好

3、run

1)光看作用域行为,run和apply差不多,但与apply不同,run函数不返回接收者,run返回的是lambda结果,也就是true或者false。2)执行函数引用

使用介绍:

java 复制代码
    /**
     * run函数的使用
     */
    // 使用方式1
    val file2 = File("E://text_demo.txt")
    val result2 = file2.run {
        readText().contains("great")
    }
     println(result2)
     输出结果:true
---------------------------------------------------------------
// 使用方式2,调用函数
    val isLong = "The people's Republic of China".run(::isLong)
    fun isLong(name: String) {
    name.length >= 10
}
    println(isLong)
    
    输出结果:true

4、with

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

使用介绍:

java 复制代码
    val resultWith = with("The people's Republic of China") {
        length >= 10
    }
    println(resultWith)
    输出结果:true

5、also

和let函数功能相似。和let一样also也是把接受者作为参数值传给lambda,但是有一点不同:also返回接收者对象,而let返回lambda结果,因为这个差异,also尤其适合针对同一原始对象,处理事务,既然also返回的是接收者对象,你就可以基于原始接收者对象执行额外的链式调用。

使用介绍:

java 复制代码
    /**
     * also函数使用
     */
    var fileContents: List<String>
    File("E://text_demo.txt")
        .also {
            println(it.name)
        }.also {
            fileContents = it.readLines()
        }
    println(fileContents)
----------------------------------------------------------------------------------    
    输出结果:
    text_demo.txt
    [I am happy to join with you today in what will go down in history as the greatest

6、takeIf

takeif函数需要判断lambda中提供的条件表达式,给出true或false结果,如果判断结果是true,从takeIf函数返回接收者对象,如果是false则返回null。如果需要判断某个条件是否满足,再决定是否可以赋值变量或执行某项任务,takeif就非常有用,takeif函数类似于if语句,但它的优势是可以直接在对象实例上调佣避免了临时变量赋值的麻烦

使用介绍:

java 复制代码
    // 如果条件返回false,则文件返回null
    val readText = File("E://text_demo.txt")
        .takeIf { it.exists() && it.canRead() }
        ?.readText()
    println(readText)
    
输出结果:文档内容

7、takeUnless

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

使用介绍:

java 复制代码
// 核心:takeUnless 是反向操作
    val readText = File("E://text_demo.txt")
        .takeUnless { it.isHidden }
        ?.readText()
    println(readText)

   输出结果:文档内容
相关推荐
FunnySaltyFish1 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Kapaseker7 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z3 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton4 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream4 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam4 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker4 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab