Kotlin 中的 inline 和nonline 和crossinline

news2025/2/21 23:03:21

inline

/**
 * 内联   递归函数无法内联,编译不通过
 * 函数的 参数 没有 lambda 无需内联--只是减少了方法调用层级 对性能没大影响
 * 函数的 参数 有 lambda 内联  
 * 1 不使用内联 在调用端,会生成 Function 对象 完成 lambda的 调用(性能损耗,for 循环 或者高频UI刷新中)
 * 2 使用内联  相当于 C++ #define 宏定义  宏替换  调用端 直接使用代码 性能高  inline fool(block:()->Unit)
 * 省略 该内联函数方法名--fool  直接 嵌入  调用处  fun { 中 }
 */

 class TestInline {
     fun test() {
         highLevelFunction("Android") {
             it.length
         }
     }
 
     private inline fun highLevelFunction(input: String, mapper: (String) -> Int): Int {
         mapper(input)
     }
 }
 
 class TestInline {
     fun test() {
           // 差不多相当于  省略 该内联函数方法名
             "Android".length
     }

noinline

noinline 需要配合 inline 使用,使用在高阶函数上,告诉编译器当前这个函数不能内联
希望的 场景
内联函数的返回值 是一个 lambda
调用该 内联函数 返回值得到 lambda
但是
内联 是 不创建 Function 对象 调用端 直接使用代码
无法识别 最后的 返回 lambda
所以 这种场景 无需内联 – noinline

在这里插入图片描述
inline
noinline

crossinline

需要配合 inline 使用 使用在高阶函数上
场景1 省略 该内联函数方法名–highLevelFunction 直接 嵌入 调用处 fun { 中 }
带有 return 直接退出的 是 外一层的函数test

Lambda 表达式里不允许使用 return,除非——这个 Lambda 是内联函数的参数。
1 Lambda 里的 return,结束的不是直接的外层函数,而是外层再外层的函数;
2 但只有内联函数的 Lambda 参数可以使用 return

 class TestInline {
     fun test() {
         highLevelFunction("Android") {
             it.length
             return // 可以 return 整个 test 函数,后续的 Log 不再输出
         }
         Log.d("TestInline", "tested")
     }
 
     private inline fun highLevelFunction(input: String, mapper: (String) -> Int): Int {
         mapper(input)
     }
 }
 
 class TestInline {
     fun test() {
           // 差不多相当于
             "Android".length
             return // 可以 return 整个 test 函数,后续的 Log 不再输出
         
         Log.d("TestInline", "tested")
     }

场景2 当 内联函数 被调用时 中间又套了一层 编译不通过
加入 crossinline 即可 间接调用和 Lambda 的 return,你只能选一个

// block 在调用处 又嵌套了一层 函数  
    protected inline fun <T: Any> LiveData<T>.observerKt(crossinline block:(T) -> Unit) {
        this.observe(this@BaseActivity, Observer { data ->
            block(data)
        })
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小程序】微信小程序自定义导航栏及其封装

&#x1f4ad;&#x1f4ad; ✨&#xff1a; 微信小程序自定义导航栏   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 因为很多东西来不及去做去看可是时间很快总是赶不上&#xff0c;所以要去成长呀&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或…

20221116 Dubbo+Zookeeper

DubboZookeeper实现分布式布局加入ZookeeperDubbo编写provider代码&#xff08;简单示例&#xff09;添加依赖代码编写consumer代码&#xff08;简单示例&#xff09;加入依赖代码加入Dubbo管理控制台DubboZookeeper实现分布式布局 加入Zookeeper 在服务器端使用docker 下载Z…

Word处理控件Aspose.Words功能演示:使用 C# 将 Word 文档转换为 Markdown

如今&#xff0c;大量的文章、博客和文档都是以Markdown ( MD ) 格式编写的。但是&#xff0c;对于大型文档&#xff0c;Markdown 语法通常变得难以记忆和编写。为方便起见&#xff0c;您可以在 MS Word 中编写内容&#xff0c;然后将DOCX或DOC文档转换为 Markdown。为了自动化…

【Redis入门笔记 09】缓存穿透、击穿与雪崩

目录&#x1f349;缓存穿透&#x1f353;缓存击穿&#x1f351;缓存雪崩☕前言&#xff1a; Redis 数据库常常用来充当传统数据库的缓存。一个实际的场景是当用户的请求过来&#xff0c;先去查缓存中的数据&#xff0c;如果缓存中不存在&#xff0c;则再去查询数据库&#xff…

快速查找qt pro文件中的用qmake language写的库函数

qt函数分为test函数和replace函数&#xff1a;qmake language 内置函数 自定义函数 defineTest(testfunctionname) defineReplace(repacefunctionname)_丘上人的博客-CSDN博客 qt为qmake language提供了内建函数&#xff08;用C写的逻辑&#xff09;和用qmake language写的库函…

html移动端实现手写签名,signature手写签名实现,微信公众号浏览器html手写签名实现

前言 html移动端手写自动横竖签名实现&#xff0c;并base64图片格式获取&#xff1b; 横竖根据屏幕宽高自动平铺。 效果图 图一 图二 实现 如下代码直接复制成.html文件打开即可预览效果 <!DOCTYPE html> <html><head><title>手写签名</title&…

适合中小企业的ERP管理软件如何选择?

在选择ERP系统时&#xff0c;我们可以按照这三个维度&#xff0c;然后再按照需求去选择ERP系统。 市面上ERP软件大概可以分为三大类&#xff1a; ① 标准ERP应用&#xff1a;功能比较固定&#xff0c;难以满足个性化需求&#xff0c;二次开发难度很高&#xff1b; ② 找外包/…

SQL 的执行流程是什么样的

在选择存储引擎时&#xff0c;应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统&#xff0c;还可以根据实际情况选择多种存储引擎进行组合。 以下是几种常用的存储引擎的使用环境。 InnoDB : 是 Mysql 的默认存储引擎&#xff0c;用于事务处理应用程序&#xf…

浅谈薄膜行业MES解决方案

随着国家节能减排的号召&#xff0c;新能源电动汽车蓬勃发展&#xff0c;带动整个锂电行业的崛起&#xff0c;锂电池的结构中&#xff0c;隔膜是关键的内层组件之一。隔膜的性能决定了电池的界面结构、内阻等&#xff0c;直接影响电池的容量、循环以及安全性能等特性&#xff0…

数据中台选型必读(四):要想中台建的好,数据模型得做好

在数据中台构建之前&#xff0c;分析师经常发现自己没有可以复用的数据集&#xff0c;不得不使用原始数据依次进行数据的清洗、加工、计算指标。 重复进行原始数据的清洗加工 由于业务部门的分析师大多是非技术出身&#xff0c;写的SQL可能比较差&#xff0c;多层嵌套对后台的…

【教学类-13-02】20221115《数字色块图5*7*8横板》(中班主题《》)

效果展示 背景需求&#xff1a; 前期中3班制作5*7 *9张数字图&#xff0c;发现三个问题&#xff1a; 1、数量太多&#xff0c;填不完——每人9张调整为每人4张&#xff08;一张A4两份作业&#xff09; 2、数字太浅&#xff0c;看不清——5*7的提示数字是灰色&#xff0c;数字…

WeNet更新:喜马拉雅团队在 WeNet 中支持 Squeezeformer

WeNet在正式发布两年的时间里&#xff0c;成为非常热门的ASR生产工具&#xff0c;其面向生产的属性更是深受工业界的好评。近期&#xff0c;喜马拉雅团队在WeNet中支持了Squeezeformer的相关工作。本文由喜马拉雅珠峰智能实验室撰写&#xff0c;介绍了Squeezeformer论文的复现细…

vant_vant引入

目录vant官网使用vant[1]导入vant 的所有组件[2] 按需引入组件[3]自动按需引入组件使用过程中遇到的问题[1]问题1-版本冲突vant官网 vant2.0官网 使用vant 参考vant官网–>快速上手–>通过npm安装/引入组件 [1]导入vant 的所有组件 [1] 安装 vant &#xff1a;npm i va…

基于matlab的MRC最大合并比误码率仿真,包括维特比译码,MRC,中继

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 最大比合并&#xff08;Maximal Ratio Combining&#xff0c;MRC&#xff09;是分集合并技术中的最优选择&#xff0c;相对于选择合并和等增益合并可以获得最好的性能&#xff0c;其性能…

STC51单片机29——汇编语言 取表法 流水灯

汇编语言编写流水灯 ORG 0 START: MOV DPTR,#TABLE LOOP: CLR A MOVC A,ADPTR CJNE A,#01H,LOOP1 //假如A等于01H &#xff0c;则执行下一句 JMP START LOOP1: MOV P1,A MOV R3,#20 LCALL DELAY INC DPTR //指针自加1 JMP LOOP DELAY: MOV R4,#20 D1: MOV R5,#24…

【6-Git安装与配置过程、Gitee码云上创建项目、IDEA关联克隆的项目】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测

异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测 目录 异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测效果一览基本介绍模型准备模型设计参考资料效果一览 基本介绍 训练一个双向 LSTM 自动编码器来检测机器是否正常工作。 自动编码器接受…

一文教你搞懂Go中栈操作

LInux 进程在内存布局 多任务操作系统中的每个进程都在自己的内存沙盒中运行。在 32 位模式下&#xff0c;它总是 4GB 内存地址空间&#xff0c;内存分配是分配虚拟内存给进程&#xff0c;当进程真正访问某一虚拟内存地址时&#xff0c;操作系统通过触发缺页中断&#xff0c;在…

前后端必知必会的HTTP,这份全彩版图解手册可算是给讲透了

HTTP HTTP (HyperText Transfer Protocol)&#xff0c;即超文本运输协议。是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用于从WWW服务器传输超文本到本地浏览器的传输协议&#xff0c;它…

基础15:npm、yarn、pnpm

npm2 用 node 版本管理工具把 node 版本降到 4&#xff0c;那 npm 版本就是 2.x 了。 执行 npm init&#xff0c; npm install express&#xff0c;可以看到node_modules目录如下&#xff1a; 可以看到&#xff0c;npm2的node_modules是嵌套的。 这种方式的优点就是模块依赖关…