当前位置: 首页 > news >正文

【Kotlin内联函数】

文章目录

  • 一. 理解何为内联
    • 1. 没有内联的场景
    • 2. 内联的场景
  • 二. inline: 内联,将函数体插入调用处,提升性能
  • 三. noinline:避免参数被内联
  • 四. crossline:限制非局部返回
  • 五. 内联函数的应用一:非局部返回
  • 六. 内联函数应用二:具体化参数类型(泛型实化)
    • 1. 概念理解
    • 2. 实际开发中的应用
      • 2.1 简化 Intent 构造
      • 2.2 网络请求封装(如 Retrofit + 协程)
      • 2.3 SharedPreferences 或数据库的通用读取器
      • 2.4 ViewModel工厂简化

一. 理解何为内联

Kotlin中每声明一个Lambda表达式,就会在字节码中产生一个匿名类;额外增加开销

1. 没有内联的场景

在这里插入图片描述
在这里插入图片描述
会生成一个Function()类型的block类,然后通过invoke方法来执行

2. 内联的场景

在这里插入图片描述
在这里插入图片描述

二. inline: 内联,将函数体插入调用处,提升性能

Kotlin 中的一个关键字,用于优化 Lambda 表达式和高阶函数的性能。它主要用于减少因使用 Lambda 而产生的额外对象创建和方法调用开销

三. noinline:避免参数被内联

在这里插入图片描述

四. crossline:限制非局部返回

在这里插入图片描述

五. 内联函数的应用一:非局部返回

内联函数除了优化Lambda开销外,还支持非局部返回。

  • 常规函数:无法局部返回

在这里插入图片描述

  • 使用Lambda表达式:编译报错

在这里插入图片描述

  • 第一种实现方式:内联函数
    在这里插入图片描述
  • 第二种方式:使用标签实现Lambda非局部返回
    在这里插入图片描述

六. 内联函数应用二:具体化参数类型(泛型实化)

1. 概念理解

fun <T> getType(): String {return T::class.java.name // ❌ 编译错误:Cannot retrieve the class of a type parameter
}
inline fun <reified T> getTypeName(): String {return T::class.java.name
}
// 输出:
println(getTypeName<String>()) // 输出:java.lang.String
println(getTypeName<Int>())    // 输出:int 或 java.lang.Integer(视上下文而定)

2. 实际开发中的应用

2.1 简化 Intent 构造

使用泛型实化可以避免手动传入 Class 类型。

inline fun <reified T> newIntent(context: Context): Intent {return Intent(context, T::class.java)
}// 使用
val intent = newIntent<DetailActivity>(context)
startActivity(intent)

2.2 网络请求封装(如 Retrofit + 协程)

如果没有 reified,你就必须手动传入 Type 或 Class,代码会变得冗长且不优雅

inline fun <reified T> apiCall(crossinline call: () -> Response<T>): Result<T> {return try {val response = call()if (response.isSuccessful) {Result.Success(response.body()!!)} else {Result.Error(Exception("API Error"))}} catch (e: Exception) {Result.Error(e)}
}

2.3 SharedPreferences 或数据库的通用读取器

inline fun <reified T> SharedPreferences.get(key: String, defaultValue: T): T {return when (T::class) {String::class -> getString(key, defaultValue as String) as TInt::class -> getInt(key, defaultValue as Int) as TBoolean::class -> getBoolean(key, defaultValue as Boolean) as Telse -> throw IllegalArgumentException("Unsupported type")}
}

2.4 ViewModel工厂简化

简化 ViewModel 的获取过程,避免重复传入 Class 对象。

inline fun <reified T : ViewModel> Fragment.viewModelProvider(factory: ViewModelProvider.Factory): T {return ViewModelProvider(this, factory)[T::class.java]
}
http://www.dtcms.com/a/561487.html

相关文章:

  • (论文速读)YOLA:学习照明不变特征的低光目标检测
  • 太原网站建设方案开发开源之家
  • 系统思考修炼之旅
  • 网站 默认首页网站域名ip地址查询
  • 矩阵系统哪个好?2025年全方位选型指南与品牌深度解析
  • 合肥瑶海区网站建设方案陇南网站建设
  • 怎么做vip视频网站dedecms 网站还原
  • 网站关键词标签php 网站源代码
  • 本地仓库如何同时绑定多个远程仓库
  • 网站基础建设巴巴商友圈wordpress最好用php
  • Maven 详解(上)
  • 25年05月架构甄选范文“论AI软件测试”,软考高级,系统架构设计师论文
  • Maven 详解(下)
  • 网站建设和托管商业网站建设与维护
  • 国内优秀的企业网站seo排名优化服务
  • 网站开发毕设文档上海软件外包公司名单
  • 4.2 IPv4【2009统考真题】
  • Photoshop - Photoshop 工具栏(21)吸管工具
  • 网站建设专公众号平台有哪些
  • wordpress 全站过滤河南省建设厅官网查询
  • AEB对碰撞安全的作用
  • [论文阅读] AI + 教育 | AI赋能“三个课堂”的破局之道——具身认知与技术路径深度解读
  • 男的和女的做那种短视频网站网站标签的作用
  • 响应式网站开发的特点万网域名管理平台
  • 车载软件需求开发与管理 --- 需求分析与分解
  • 点击劫持攻击完整防护指南
  • 预备知识总结
  • 想自己做网站流程抚顺市营商环境建设局网站
  • 西安网站关键词优化费用淄博网站制作服务优化
  • alsa之ASOC架构学习