Kotlin学历之内联函数

zzyandroid / 文 发表于2017-06-28 09:42 第次阅读 android,java,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 修饰的。


foEach函数源码

总结

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


收藏 赞 (0) 踩 (0)