最全Kotlin学习——kt里的作用域函数scope function,let,run,with,2024年最新一线互联网大厂中高级软件测试面试真题收录

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

+ [also 打印日志](#also__209)

引出


1.Kotlin标准库函数let可用于作用域和null检查;
2.执行一个代码块并返回其结果。不同的是,在run函数中,对象是通过 this 访问的;
3.with是一个非扩展函数,可以简洁地访问其参数的成员:在引用其成员时可以省略实例名称;
4.apply在对象上执行一个代码块,并返回对象本身;
5.also工作原理与apply类似:它执行给定的块并返回调用的对象。在块内部,对象被它引用,日志打印;

let

Kotlin标准库函数let可用于作用域和null检查。当对对象调用时,let执行给定的代码块并返回其最后一个表达式的结果。可以通过参照对象(默认情况下)或自定义名称在块内部访问对象。

package com.tianju.kt.scopeFunc

fun customPrint(s: String) {
    print(s.uppercase())
}


fun main() {
    val empty = "test".let {
        customPrint(it)
        it.isEmpty()
    }

    // TEST is empty false
    println(" is empty $empty")


    // Printing "null":
    // Printing "my string":
    // MY STRING
    fun printNonNull(str: String?) {
        println("Printing \"$str\":")

        str?.let {
            print("\t")
            customPrint(it)
            println()
        }
    }

    // FIRST : SECOND
    fun printIfBothNonNull(strOne: String?, strTwo: String?) {
        strOne?.let { firstString ->
            strTwo?.let { secondString ->
                customPrint("$firstString : $secondString")
                println()
            }
        }
    }

    printNonNull(null)
    printNonNull("my string")
    printIfBothNonNull("First","Second")
}

在这里插入图片描述

run

与let一样,run是标准库中的另一个作用域函数。基本上,它也是这样做的:执行一个代码块并返回其结果。不同的是,在run函数中,对象是通过 this 访问的。当您想调用对象的方法而不是将其作为参数传递时,这很有用。

package com.tianju.kt.scopeFunc

fun main() {
    fun getNullableLength(ns: String?) {
        println("for \"$ns\":")
        ns?.run {
            // 访问对象的成员时不使用其名称
            println("\tis empty? " + isEmpty())
            println("\tlength = $length")
            this.length
        }
    }
    getNullableLength(null)
    getNullableLength("")
    getNullableLength("some string with Kotlin")
}

在这里插入图片描述

with

with是一个非扩展函数,可以简洁地访问其参数的成员:在引用其成员时可以省略实例名称。

package com.tianju.kt.scopeFunc

class Configuration(var host: String, var port: Int)

fun main() {
    val configuration = Configuration(host = "127.0.0.1", port = 9000)

    // 在引用其成员时可以省略实例名称
    with(configuration) {
        println("$host:$port")
    }

    // instead of:
    println("${configuration.host}:${configuration.port}")
}

在这里插入图片描述

apply 类似set方法

apply在对象上执行一个代码块,并返回对象本身。在块内部,对象被此引用。此函数用于初始化对象非常方便。

类似java里面new 对象后,进行set值

package com.tianju.kt.scopeFunc

/\*\*
 \* 数据类
 \*/
data class Person(var name: String, var age: Int, var about: String) {
    // 构造方法有默认值
    constructor() : this("", 0, "")


![img](https://img-blog.csdnimg.cn/img_convert/5ec76e47731e81a29eeae3b6bb31ac54.png)
![img](https://img-blog.csdnimg.cn/img_convert/7ac481c4ff2a9f438aadae266a095cfc.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin 协程中,协程是可以嵌套的,而在协程作用域中启动的协程都会遵循作用域的规则。具体来说,当协程作用域被取消时,作用域中启动的所有协程都会被取消。当启动一个新的协程时,它会成为父协程的子协程,如果父协程被取消,那么所有的子协程也会被取消。 在协程作用域中嵌套两个子协程和一个普通函数时,如果普通函数没有被包装在一个协程中启动,那么它将不受协程作用域的影响,它将在当前线程中执行,并且会先于子协程执行。这是因为协程是一种轻量级的线程,它们可以在同一个线程中并发执行,但是它们需要协作才能正确地交替执行。而普通函数不是协程,它不会自动地参与到协程的协作中去。 如果你想让普通函数和子协程同时执行,你可以将普通函数包装成一个协程并在协程作用域中启动它。这样,它就会成为父协程的子协程,遵循协程作用域的规则,同时也能与其他子协程正确地协作执行。例如,可以使用 `launch` 函数启动一个新的协程来包装普通函数: ```kotlin val scope = CoroutineScope(Dispatchers.Default) scope.launch { // 第一个子协程 launch { println("子协程 1 开始执行") delay(1000) println("子协程 1 执行结束") } // 第二个子协程 launch { println("子协程 2 开始执行") delay(500) println("子协程 2 执行结束") } // 普通函数包装成的协程 launch { println("普通函数开始执行") delay(750) println("普通函数执行结束") } } ``` 在这个示例中,我们使用 `CoroutineScope` 创建了一个协程作用域,并使用 `launch` 函数分别启动了三个子协程。其中,第一个子协程会执行 1 秒钟,第二个子协程会执行 0.5 秒钟,而第三个子协程是一个包装了普通函数的协程,它会执行 0.75 秒钟。由于这三个子协程都是在同一个协程作用域中启动的,它们将会遵循协程作用域的规则,正确地交替执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值