Kotlin的内置函数

Kotlin 提供了丰富的内置函数,它们极大简化了日常开发工作。常见内置函数包括 标准库函数(let、apply、run 等),用于提高代码的简洁性和可读性。下面我们详细介绍这些函数的功能、用法以及它们之间的区别。

1. let 函数

let 通常用于避免空指针异常 (null) 或执行某个块逻辑并返回结果。
在这里插入图片描述

示例 1:let 实现空安全

val name: String? = "Kotlin"
name?.let { println("The name is $it") 
} // 如果 name 是 null,不会执行 let 块

示例 2:链式调用

val result = "Kotlin".let {println("Processing: $it")it.length
}.let { println("Length: $it")it * 2
}
println("Final Result: $result")

输出:

Processing: Kotlin
Length: 6
Final Result: 12

实例3:和java相比,let配合?能让我们避免写if判空的同时确定了变量的作用范围

// 使用Java
if( mVar != null ){mVar.function1();mVar.function2();mVar.function3();
}// 使用kotlin(无使用let函数)
mVar?.function1()
mVar?.function2()
mVar?.function3()// 使用kotlin(使用let函数)
// 方便了统一判空的处理 & 确定了mVar变量的作用域
mVar?.let {it.function1()it.function2()it.function3()
}

2. apply 函数

apply 返回对象本身,通常用于对象的初始化或批量赋值。

示例 1:初始化对象

data class Person(var name: String, var age: Int)val person = Person("Unknown", 0).apply {name = "Alice"age = 25
}
println(person) // 输出:Person(name=Alice, age=25)

如果初始化对象是map类型:

fun main() {var people: MutableMap<String, Any> = mutableMapOf()people.apply {this["name"] = "Alice"this["age"] = 25}println(people) // 输出:{name=Alice, age=25}
}

示例 2:配合嵌套初始化

val person = Person("Unknown", 0).apply {name = "Bob"age = 30
}.apply {println("Configured person: $this")
}

3. run 函数

run 用于对对象执行代码块并返回结果,常用于需要执行多个操作且返回最后结果的场景,run可以看成是let+with,可以在判空的同时省去写对象名

示例 1:对象操作后返回结果

val introduction = Person("John", 20).run {"Hi, my name is $name and I am $age years old."
}
println(introduction) // 输出:Hi, my name is John and I am 20 years old.

示例2:结合Elvis 运算符 ?:

class UserNotFoundException(message: String) : Exception(message)data class User(val id: String, val name: String)fun getUserById(userId: String): User? {// 假设这是从数据库或其他数据源获取用户的逻辑return null // 模拟未找到用户
}fun main() {val userId = "12345"val user = getUserById(userId) ?: run {// 如果 user 是 null,则执行此块val msg = "UserNotFound: User with ID $userId could not be found."println("Error: $msg") // 模拟 logger.error(msg)throw UserNotFoundException(msg)}// 如果找到了用户,则继续执行println("User found: ${user.name}")
}

效果等价于:

class UserNotFoundException(message: String) : Exception(message)data class User(val id: String, val name: String)fun getUserById(userId: String): User? {// 假设这是从数据库或其他数据源获取用户的逻辑return null // 模拟未找到用户
}fun main() {val userId = "12345"val user = getUserById(userId)if (user==null){// 如果 user 是 null,则执行此块val msg = "UserNotFound: User with ID $userId could not be found."println("Error: $msg") // 模拟 logger.error(msg)throw UserNotFoundException(msg)}// 如果找到了用户,则继续执行println("User found: ${user.name}")
}

4. also 函数

also 主要用于链式调用中的副作用操作,比如打印日志或检查条件。

示例 1:日志输出辅助

val numbers = mutableListOf(1, 2, 3).also { println("Initial list: $it")
}.apply {add(4)
}.also {println("Updated list: $it")
}

输出:

Initial list: [1, 2, 3]
Updated list: [1, 2, 3, 4]

示例2:和let类似,区别在于let函数返回值是最后一行,also是返回传入的对象本身

// let函数
var result = mVar.let {it.function1()it.function2()it.function3()999
}
// 最终结果 = 返回999给变量result// also函数
var result = mVar.also {it.function1()it.function2()it.function3()999
}
// 最终结果 = 返回一个mVar对象给变量result

5. with 函数

with 是非扩展函数,适合处理需要多次使用同一对象的场景,用with函数可以在调用同一个对象的多个方法或属性时,可以省去对象名重复,直接调用方法名或属性

示例 1:使用 with 简化代码

val person = Person("Alice", 25)
val introduction = with(person) {"My name is $name and I am $age years old."
}
println(introduction) // 输出:My name is Alice and I am 25 years old.

返回值是函数的最后一行

6. 内置函数嵌套使用

场景:初始化对象、打印日志并返回处理结果

data class Car(var brand: String, var year: Int)val car = Car("Unknown", 0).apply {brand = "Tesla"year = 2022
}.also {println("Car initialized: $it")
}.run {"The car is a $brand from $year."
}.let { result ->println("Final Result: $result")
}

输出:

Car initialized: Car(brand=Tesla, year=2022)
Final Result: The car is a Tesla from 2022.

解释:
使用 apply 初始化对象。
用 also 打印日志。
用 run 返回拼接后的字符串结果。
最后用 let 处理并打印结果。

7. 多个内置函数嵌套示例:处理链式数据

场景:用户输入处理、日志记录、结果返回

fun processInput(input: String?) {input?.let {it.trim()}?.also { println("Trimmed input: $it")}?.run {if (isNotEmpty()) this.uppercase() else "EMPTY"}?.let { result ->println("Processed Result: $result")}
}processInput("  Kotlin  ") // 输入非空字符串
processInput("   ")        // 输入空格

输出:

Trimmed input: Kotlin
Processed Result: KOTLIN
Trimmed input: 
Processed Result: EMPTY

解释:
let 用于处理非空输入并去除空格。
also 打印中间结果。
run 检查是否为空,返回大写结果或 “EMPTY”。
let 打印最终处理结果。

8. 内置函数对比总结

函数返回值接收者主要用途嵌套场景
letLambda 结果it对非空对象操作并返回结果处理结果或链式调用
apply对象本身this初始化对象或配置属性初始化链式调用
runLambda 结果this对对象执行操作并返回结果逻辑处理后返回
also对象本身it执行副作用操作(如日志)调试、日志记录
withLambda 结果this多次调用同一对象简化代码结构

let:适合处理非空对象,并返回结果。常用于链式调用。
apply:适合初始化对象,返回对象本身。适用于配置初始化对象。
run:适合执行操作并返回结果,用于逻辑处理。
also:适合执行副作用操作,不改变返回值。常用于日志记录或调试。
with:适合需要多次使用同一对象的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464910.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pod安装软件将CDN改为国内的镜像

1、碰到错误 在pod install的时候碰到以下的下载错误&#xff1a; 文字错误如下&#xff1a; CDN: trunk URL couldnt be downloaded: https://cdn.jsdelivr.net/cocoa/Specs/5/b/d/OpenCV/2.4.11/OpenCV.podspec.json Response: Timeout was reached CDN: trunk URL couldn…

Rockchip SoC AI 与视觉处理器路线图:赋能未来的 AI 驱动设备

随着人工智能&#xff08;AI&#xff09;和计算机视觉技术不断推动各行各业的创新&#xff0c;Rockchip 已成为提供强大系统级芯片&#xff08;SoC&#xff09;解决方案的领先厂商。该公司已开发出多款集成 AI 功能并支持先进多媒体与视觉技术的 SoC&#xff0c;非常适合用于 A…

尚庭公寓-小程序接口

7. 项目开发 7.4 移动端后端开发 7.4.1 项目初始配置 7.4.1.1 SpringBoot配置 1. 创建application.yml文件 在web-app模块的src/main/resources目录下创建application.yml配置文件&#xff0c;内容如下&#xff1a; server:port: 80812. 创建SpringBoot启动类 在web-app…

练习LabVIEW第三十八题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十八题&#xff1a; 创建一个VI&#xff0c;实现对按钮状态的指示和按钮“按下”持续时间简单计算功能&#xff0c;按…

HTMLCSS:3D 旋转卡片的炫酷动画

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个具有3D效果的动画卡片。 HTML <div class"obj"><div class"objchild"><span class"inn6"><h3 class"text">我是谁&#xff1f;我在那<…

微控制器(MCU)如何运行存储在Flash的程序???

忙&#xff0c;太忙了&#xff01;&#xff01;&#xff01;忙完就好了。MCU运行不也就如此&#xff1f;在微控制器单元&#xff08;MCU&#xff09;中&#xff0c;我们所编写的程序时通常是存储在闪存&#xff08;Flash&#xff09;中。当MCU启动时&#xff0c;它会从闪存中读…

yolov8涨点系列之引入CBAM注意力机制

文章目录 YOLOv8 中添加注意力机制 CBAM 具有多方面的好处特征增强与选择通道注意力方面空间注意力方面 提高模型性能计算效率优化&#xff1a; yolov8增加CBAM具体步骤CBAM代码(1)在__init.pyconv.py文件的__all__内添加‘CBAM’(2)conv.py文件复制粘贴CBAM代码(3)修改task.py…

如何无缝更换WordPress主题:关键步骤详解

更换WordPress主题对于希望刷新网站外观或改善用户体验的站长来说&#xff0c;是一项常见但不容忽视的任务。无论是为了提升性能还是实现新的设计风格&#xff0c;在更换主题时&#xff0c;确保不遗漏任何重要细节至关重要。本文将详细介绍更换WordPress主题的关键步骤&#xf…

推荐一款PowerPoint转Flash工具:iSpring Suite

iSpring Suite是一款PowerPoint转Flash工具&#xff0c;使用iSpring Suite 8可以轻松的将PPT演示文档转换为对Web友好的Flash影片格式。软件界面简洁&#xff0c;使用方便。为什么要转换成flash格式呢?Flash格式的最大特点是体积小巧、易于分发&#xff0c;兼容所有的操作系统…

【案例】故障雪花屏

开发平台&#xff1a;Unity 6.0 开发工具&#xff1a;Shader Graph 参考视频&#xff1a;【U2D Shader Graph】❄️雪❄️花❄️屏❄️   一、效果图 二、Shader Graph 路线图 三、案例分析 核心思路&#xff1a;雪花屏幕效果 &#xff08;混合&#xff09; 原图像 最终图像…

ffplay 实现视频流中音频的延迟

ffplay -rtsp_transport tcp -i rtsp://admin:1234qwer192.168.1.64:554/Streaming/Channels/101 -vn -af "adelay5000|5000"在这个命令中&#xff1a; -vn 参数表示只播放音频。 -af "adelay5000|5000" 参数表示将音频延迟5000毫秒&#xff08;即5秒&…

科技资讯|谷歌Play应用商店有望支持 XR 头显,AR / VR设备有望得到发展

据 Android Authority 报道&#xff0c;谷歌似乎正在为其 Play 商店增加对 XR 头显的支持。该媒体在 Play 商店的代码中发现了相关的线索&#xff0c;包括一个代表头显的小图标以及对“XR 头显”的提及。 谷歌也可能改变了此前拒绝将 Play 商店引入 Meta Quest 头显的决定。今…

Pr 视频效果:超级键

视频效果/键控/超级键 Keying/Ultra Key 超级键 Ultra Key效果是 Premiere Pro 中功能强大的抠像工具&#xff0c;主要用于绿幕/蓝幕抠像。通过选择要抠除的颜色&#xff08;通常是绿幕或蓝幕的颜色&#xff09;&#xff0c;即可以将该颜色的像素设为透明&#xff0c;实现主体与…

Git使用指南

目录 工作机制基本框架:流程图 基本命令分支操作远程仓库本地仓库关联远程仓库 参考 工作机制 基本框架: Workspace&#xff1a;开发者工作区&#xff0c;也就是你当前写代码的目录&#xff0c;它一般保持的是最新仓库代码。Index / Stage&#xff1a;暂存区&#xff0c;最早…

计算机网络:简述LAN口模式下NAT和代理的区别

LAN口模式 NAT和代理的区别 LAN口模式下的NAT和代理的区别主要体现在定义、功能和应用场景上。 # NAT和代理的定义和功能 ‌NAT&#xff08;网络地址转换&#xff09;‌&#xff1a;NAT是一种网络地址翻译技术&#xff0c;它将内部私有IP地址转换为公网IP地址&#xff0c;使得…

qt QFile详解

1、概述 QFile类是Qt框架中用于读取和写入文本和二进制文件资源的I/O工具类。它继承自QFileDevice类&#xff0c;后者又继承自QIODevice类。QFile类提供了一个接口&#xff0c;允许开发者以二进制模式或文本模式对文件进行读写操作。默认情况下&#xff0c;QFile假定文件内容为…

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…

单臂路由技术,eNSP实验讲解

单臂路由技术&#xff0c;eNSP实验讲解 一、简要介绍1、概念2、工作原理3、优点4、缺点5、应用场景举例 二、eNSP仿真实验1、步骤一&#xff1a;2、步骤二&#xff1a;3、步骤三&#xff1a;4、步骤四&#xff1a; 三、总结。 一、简要介绍 1、概念 单臂路由&#xff08;Rout…

机器学习—构建一个神经网络

如何在Tensorflow中构建神经网络&#xff1f; 回到之前的例子&#xff0c;如果你想做钱进支柱&#xff0c;初始化数据x创建第一层&#xff0c;如下图所示计算一个1&#xff0c;然后创建第二层并计算一个2&#xff0c;所以这是一种明确的向前推进的方式。 事实证明&#xff0c;…

JMeter与大模型融合应用之jmeter.properties配置文件新增配置

JMeter与大模型融合应用之jmeter.properties配置文件新增配置 背景 Apache JMeter 是一款流行的开源性能测试工具&#xff0c;它允许用户通过创建和运行多种类型的测试来评估应用程序的性能。jmeter.properties 文件是 JMeter 的主要配置文件之一&#xff0c;用户可以在其中进…