Kotlin学历之内联函数

简介: Kotlin学历之内联函数

简述


看了很多博客,才明白了内联的含义,其实最根本的就是将写在别处的代码拷贝到你现在执行的方法中,相当于在一个方法中执行,java的方法执行是需要压栈出栈的对吧,如果是两三个方法那就是两三次的压栈出栈,为了节省这个操作,提高一定的效率,kotlin就出了这么个函数。但又想想,如果是个超级大的函数,考来考去的也是很麻烦啊,所以这东西需要自己权衡吧,遵守单一职责,降低代码圈发杂度才是根本。

声明


用到  inline 关键字

inline fun 函数名(参数){ }

注意:如果就是这么个简单的函数,kotlin是不建议内联的,内联目前主要还是应用在 函数参数是lambda表达式的代码中

例如:

inline fun  line( inlined : () -> Unit){
}

注意:inline修饰符影响函数本身和传给它的 lambda 表达式:所有这些都将内联到调用处。如果有两个以上的lambda参数,只想联一个怎么办,就用到了 noinline 关键字

例如:

inline fun  line( inlined : () -> Unit, noinlined  noline : () - > T) : T {
}

非局部返回


想想在java中,你如果调用了一个方法 如果方法里面有返回 也是在当前方法返回,肯定不能返回到它的调用者方法内,在kotlin中也是同样的道理,但如果你生命一个函数为内联之后就可以返回了,因为内联是将代码考进来了,在一条线上啊,可以直接返回。

例如:不使用内联 肯定是错误的

fun foo(){ 
    ordinaryFunction {
           return// 错误:不能使 `foo` 在此处返回
    }
}

使用后就可以了

fun foo(){
    inlineFunction {
         return// OK:该 lambda 表达式是内联的
    }
}

具体一个例子,官方的

fun hasZeros(ints :List) :Boolean{ 
       ints.forEach {
            if(it ==0) return true // 从 hasZeros 返回
       }
       return false
}

看下 foEach函数的定义就可以明白了,使用inline 修饰的。

image.png

foEach函数源码

总结


自动kotlin1.1之后 还有内联属性,这个就有些不理解了,在以后彻底摸清之后,再回头补充吧,内联函数在一定程度上提高了代码的执行效率,但也会有其他麻烦,看来没有一种设计是完美的,使用的时候一定要注意场景,就这样,下期再见。

目录
相关文章
|
6月前
|
存储 Kotlin
Kotlin中的内联函数:提升性能与解决Lambda表达式参数问题
Kotlin中的内联函数:提升性能与解决Lambda表达式参数问题
|
Java Kotlin
Kotlin内联函数inline、noinline、crossinline
如果一个函数接收另一个函数作为参数,或返回类型是一个函数类型,那么该函数被称为是高阶函数
160 0
|
Kotlin
Kotlin学历之导图
Kotlin学历之导图
92 0
Kotlin学历之导图
|
安全 Android开发 Kotlin
Kotlin学历之Android MVP架构实战
Kotlin学历之Android MVP架构实战
158 0
Kotlin学历之Android MVP架构实战
|
安全 Java 编译器
Kotlin学历之空安全
Kotlin学历之空安全
103 0
Kotlin学历之空安全
|
JSON 安全 Java
Kotlin学历之委托属性
Kotlin学历之委托属性
130 0
Kotlin学历之委托属性
|
Java Kotlin
Kotlin学历之扩展与委托
Kotlin学历之扩展与委托
126 0
Kotlin学历之扩展与委托
|
Java 编译器 Kotlin
Kotlin学历之可见性修饰符
Kotlin学历之可见性修饰符
100 0
Kotlin学历之可见性修饰符
|
Java 编译器 Kotlin
Kotlin学历之抽象类与接口
Kotlin学历之抽象类与接口
127 0
Kotlin学历之抽象类与接口
|
Java Kotlin
Kotlin中内联函数的作用是什么?
在以前,因为学过一段时间Kotlin(并没有实际开发中用过),很多东西都忘记了,但是kotlin的代码看起来其实和Java没什么区别,感觉都差不多。所以不要认为 Kotlin 很难学。
208 0