Android经典面试题之Kotlin中常见作用域函数

简介: **Kotlin作用域函数概览**: `let`, `run`, `with`, `apply`, `also`. `let`安全调用并返回结果; `run`在上下文中执行代码并返回结果; `with`执行代码块,返回结果; `apply`配置对象后返回自身; `also`附加操作后返回自身

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

Kotlin 中提供了一些内置的作用域函数(Scope Functions),它们通过改变代码块的上下文对象,使代码更加简洁和易读。主要的作用域函数有以下五个:letrunwithapplyalso。这些函数主要区别在于:传递给代码块的对象是作为参数还是接收者,以及它们的返回值是什么。以下是对每个作用域函数的详细说明:

1. let

  • 用法let 函数常用于可以避免空指针异常(NullPointerException),即在对象为非空时执行特定代码块。
  • 上下文对象:通过参数 it 传递。
  • 返回值:返回代码块的执行结果。
val name: String? = "Kotlin"
val result = name?.let {
    println("Name length: ${it.length}")
    it.length
}
println(result)  // 输出: Name length: 6
                 // 输出: 6

2. run

  • 用法run 函数通常用于在对象的上下文中执行一段代码,并返回代码块的结果。
  • 上下文对象:通过接收者 this 传递。
  • 返回值:返回代码块的执行结果。
val name = "Kotlin"
val result = name.run {
    println("Name length: $length")  // this指向name,所以可以直接访问length
    length
}
println(result)  // 输出: Name length: 6
                 // 输出: 6

3. with

  • 用法with 函数不是一个扩展函数,而是一个普通的高阶函数。它在提供的一种对象上执行代码块,经常用于对同一个对象的多个属性进行操作。
  • 上下文对象:通过接收者 this 传递。
  • 返回值:返回代码块的执行结果。
val name = "Kotlin"
val result = with(name) {
    println("Name length: $length")  // this指向name,所以可以直接访问length
    length
}
println(result)  // 输出: Name length: 6
                 // 输出: 6

4. apply

  • 用法apply 函数通常用于配置对象。它在代码块内可以引用对象的所有公有成员,可以对对象进行初始化、属性设置等操作。
  • 上下文对象:通过接收者 this 传递。
  • 返回值:返回对象本身。
val person = Person().apply {
    name = "Kotlin"
    age = 5
}
println(person)  // 输出: Person(name=Kotlin, age=5)

5. also

  • 用法also 函数通常用于在链式调用中进行一些额外的操作,比如打印日志或者进行某些检查。
  • 上下文对象:通过参数 it 传递。
  • 返回值:返回对象本身。
val name = "Kotlin"
val result = name.also {
    println("Name is $it")
}
println(result)  // 输出: Name is Kotlin
                 // 输出: Kotlin

总结

  • letalso:通过 it 作为参数传递上下文对象。
  • runwithapply:通过 this 作为接收者传递上下文对象。
  • letrunwith:返回代码块的结果。
  • applyalso:返回上下文对象自身。

根据需求选择合适的作用域函数,可以让你的代码更简洁和直观。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
9月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
407 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
Android开发 开发者 Kotlin
Android实战经验之Kotlin中快速实现MVI架构
MVI架构通过单向数据流和不可变状态,提供了一种清晰、可预测的状态管理方式。在Kotlin中实现MVI架构,不仅提高了代码的可维护性和可测试性,还能更好地应对复杂的UI交互和状态管理。通过本文的介绍,希望开发者能够掌握MVI架构的核心思想,并在实际项目中灵活应用。
571 8
|
编译器 Android开发 开发者
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
370 9
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
400 1
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
271 4
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
369 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
2366 2