【Kotlin内联函数】

文章目录

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

一. 理解何为内联

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

1. 没有内联的场景


会生成一个Function()类型的block类,然后通过invoke方法来执行

2. 内联的场景


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

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

三. noinline:避免参数被内联

四. crossline:限制非局部返回

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

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

  • 常规函数:无法局部返回
  • 使用Lambda表达式:编译报错
  • 第一种实现方式:内联函数
  • 第二种方式:使用标签实现Lambda非局部返回

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

1. 概念理解

java 复制代码
fun <T> getType(): String {
    return T::class.java.name // ❌ 编译错误:Cannot retrieve the class of a type parameter
}
java 复制代码
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 类型。

kotlin 复制代码
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,代码会变得冗长且不优雅

kotlin 复制代码
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 或数据库的通用读取器

kotlin 复制代码
inline fun <reified T> SharedPreferences.get(key: String, defaultValue: T): T {
    return when (T::class) {
        String::class -> getString(key, defaultValue as String) as T
        Int::class -> getInt(key, defaultValue as Int) as T
        Boolean::class -> getBoolean(key, defaultValue as Boolean) as T
        else -> throw IllegalArgumentException("Unsupported type")
    }
}

2.4 ViewModel工厂简化

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

kotlin 复制代码
inline fun <reified T : ViewModel> Fragment.viewModelProvider(factory: ViewModelProvider.Factory): T {
    return ViewModelProvider(this, factory)[T::class.java]
}
相关推荐
Chester_199910 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲11 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员12 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导12 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan12 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_6952514912 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
大衛說13 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
_祝你今天愉快13 小时前
从驱动来分析服务的添加过程
android
可乐鸡翅yeah_15 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
2601_9622035115 小时前
Java进阶07集合(续)
java·开发语言