经过编译器编译之后,runCatch()方法中的 Lambda 参数被替换为Function0<Unit>类型,在run()方法中实际调用runCatch()时传入的参数是实现了Function0<Unit>接口的InlineKt.run.1,并重写 了invoke()方法。 所以,调用runCatch()的时候,会创建一个额外的类InlineKt.run.1。这是 Lambda 没有捕捉变量的场景。如果捕捉...
正常参数如果被直接调用或者作为参数传递给另外一个inline函数,该参数是可以被内联。 如一中所述:lambda默认是inline函数,所以在传入synchronized的时候也被当作内联函数继续被解析 当禁止传入的函数也被内联,则可以对该函数参数使用noinline inline funsynchronized(lock: Lock, noinline action: () ->Unit) { lock.l...
Kotlin 高阶函数的额外开销:匿名内部类 inline 传统的定义是什么 Wiki:在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用...
Kotlin 还允许在inline函数中使用reified关键字,以便在函数中访问泛型类型。这是inline函数的一个高级特性,可以使泛型参数的类型在编译时被替换为具体类型,而不需要通过反射。 inline fun <reified T> printType() { println(T::class.java) } 在这个例子中,printType是一个带有泛型参数T的inline函数。由于函数被...
首先,noinline 关键字是作用于 Lambda 闭包的;其次,它是用于在修饰了 inline 关键字的函数中,剔除 inline 关键字对 Lambda 闭包的影响,让它就作为一个普通的 Lambda 闭包。说明不够,代码来凑! // code 13 inline fun test2(lambda0: () -> Unit, noinline lambda1: () -> Unit): () -> Unit { ...
1、普通函数,不需要使用inline,jvm会自动的判断是否做内联的优化,inline都是针对高阶函数 2、大量函数体的行数,应该避免,这样会产生过多的字节码数量(每次调用的地方,都会重复生产该函数的字节码) 还有一个特殊的场景:避免被内联:noinline 有一种可能是函数需要接收多个参数,但我们只想对其中部分Lambda参数内联,其...
kotlin中inline、noinline、crossinline 一、概念 inline(内联): 编译时将函数的代码拷贝到调用的地方。 noinline(非内联): 内联高阶函数的形参中,不希望内联的lambda参数。 crossinline: 内联高阶函的形参中的lambda不能有非局部return,该lambda需要间接调用就需要。
简介: Kotlin 学习笔记(四)—— 作用域函数、inline 关键字、反引号等 Kotlin 基本用法(上) 在上一篇中我们见识到了 Kotlin 语言所特有的几种类——数据类、密闭类等,也熟悉了 Kotlin 中集合的常用运算符,以后再也不用担心 Kotlin 集合的相关问题了。这是笔记系列的第四篇,渐入佳境了吧! 1. Kotlin 作用域...
简单来说被inline修饰过的函数,会在调用的时候把函数体替换过来。说起来可能很从抽象,直接看代码:publicinlinefunprint(message: Int) { System.out.print(message)}funmain(args: Array<String>) { print(2) print(2)} 反编译class之后,我们会看到是这个样子的:publicstaticfinalvoidmain(@NotNull St...
Kotlin基础知识_08-高阶函数&内联函数&inline&noinline&crossinline 1. 高阶函数 kotlin中的高阶函数允许传入的函数体来决定函数的执行结果。当需要调用一个高阶函数时,调用方式分为两种: 使用函数引用的方式去调用; 使用Lambda表达式的方式去调用; 1.1 使用函数引用的方式去调用 ...