news 2026/7/22 19:07:38

【Kotlin内联函数】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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{returnT::class.java.name// ❌ 编译错误:Cannot retrieve the class of a type parameter}
inline fun<reifiedT>getTypeName():String{returnT::class.java.name}// 输出:println(getTypeName<String>())// 输出:java.lang.Stringprintln(getTypeName<Int>())// 输出:int 或 java.lang.Integer(视上下文而定)

2. 实际开发中的应用

2.1 简化 Intent 构造

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

inlinefun<reifiedT>newIntent(context:Context):Intent{returnIntent(context,T::class.java)}// 使用valintent=newIntent<DetailActivity>(context)startActivity(intent)

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

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

inlinefun<reifiedT>apiCall(crossinlinecall:()->Response<T>):Result<T>{returntry{valresponse=call()if(response.isSuccessful){Result.Success(response.body()!!)}else{Result.Error(Exception("API Error"))}}catch(e:Exception){Result.Error(e)}}

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

inlinefun<reifiedT>SharedPreferences.get(key:String,defaultValue:T):T{returnwhen(T::class){String::class->getString(key,defaultValueasString)asT Int::class->getInt(key,defaultValueasInt)asT Boolean::class->getBoolean(key,defaultValueasBoolean)asTelse->throwIllegalArgumentException("Unsupported type")}}

2.4 ViewModel工厂简化

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

inlinefun<reifiedT:ViewModel>Fragment.viewModelProvider(factory:ViewModelProvider.Factory):T{returnViewModelProvider(this,factory)[T::class.java]}publicinlinefunComponentActivity.viewModels(noinlineextrasProducer:(()->CreationExtras)?=null,noinlinefactoryProducer:(()->Factory)?=null):Lazy<VM>{valfactoryPromise=factoryProducer?:{defaultViewModelProviderFactory}returnViewModelLazy(VM::class,{viewModelStore},factoryPromise,{extrasProducer?.invoke()?:this.defaultViewModelCreationExtras})}使用 noline:publicinlinefunComponentActivity.viewModels(noinlineextrasProducer:(()->CreationExtras)?=null,noinlinefactoryProducer:(()->Factory)?=null):Lazy<VM>{valfactoryPromise=factoryProducer?:{defaultViewModelProviderFactory}returnViewModelLazy(VM::class,{viewModelStore},factoryPromise,{extrasProducer?.invoke()?:this.defaultViewModelCreationExtras})}1.使用 noline:inline时,作为参数传进来的 lambda 默认会被 “展开成代码”,但是这里需要作为参数传递;2.使用泛型实化,是因为需要获取 VM 的具体类型
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 19:04:22

在 Jetson JP6.X 版本upgrade更新失败解决方法

在Jetson平台JP6版本上&#xff0c;包括Orin NX和AGX Orin开发套件&#xff0c;尝尝会有upgrade更新失败&#xff0c;jtop无法获取到JetPack版本等问题&#xff0c;给出具体原因和解决方法。 问题&#xff1a; 在 Jetson JP6.X 版本中&#xff0c;如果是客户自定义的板子&…

作者头像 李华
网站建设 2026/7/22 19:03:24

Metaboss部署指南:如何在不同环境中配置和运行的最佳实践

Metaboss部署指南&#xff1a;如何在不同环境中配置和运行的最佳实践 【免费下载链接】metaboss The Metaplex NFT-standard Swiss Army Knife tool. 项目地址: https://gitcode.com/gh_mirrors/me/metaboss Metaboss 作为 Metaplex NFT 标准的瑞士军刀工具&#xff0c;…

作者头像 李华
网站建设 2026/7/22 18:57:40

【单片机毕业设计推荐】基于 STM32/51 单片机的智能温控风扇调速系统设计与实现,基于 STM32/51 单片机的温度监测可调速风扇控制系统设计(025502)

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能基础功能核心功能辅助功能技术路线项目演示关于我们项目案例源码获取博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&…

作者头像 李华
网站建设 2026/7/22 18:55:00

【Python课程设计/毕业设计】基于 Python 的轻量化新闻采集聚合运维服务系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/22 18:53:11

C++ 修饰符全面详解

前言在 C 开发体系中&#xff0c;修饰符&#xff08;限定符 / 说明符&#xff09;是一组特殊关键字&#xff0c;作用于变量、指针、函数、类、类成员&#xff0c;用于约束实体的访问权限、生命周期、存储位置、可修改性、编译行为、多态特性。相较于 C 语言&#xff0c;C 扩充了…

作者头像 李华
网站建设 2026/7/22 18:52:15

RabbitMQ高可用方案

RabbitMQ消息可靠性保障、异常处理等相关背景&#xff0c;RabbitMQ高可用方案主要分为三类&#xff0c;官方推荐新项目优先使用仲裁队列&#xff0c;老系统可按需选择镜像队列或普通集群配合外部负载均衡。 一、主流高可用方案选型 ‌仲裁队列&#xff08;Quorum Queue&#xf…

作者头像 李华