Kotlin-内联inline、noinline、reified、crossinline

1.3.1 inline
    函数在运行时都会生成一个对象,很多的小函数意味着额外的开销,使用内联函数则会在编译时进行优化。[编译会在调用方生成代码]
    
    inline fun <T> lock(lock: Lock, body: () -> T): T {...}

    1.3.2 noinline
    如果希望只内联一部分传给内联函数的 lambda 表达式参数,那么可以用 noinline 修饰符标记不希望内联的函数参数 [inline只能编译一层   不能边缘内部在调用]
    
    inline fun foo(name: () -> Unit, noinline age: () -> Unit) { …… 


    1.3.3 局部返回 return & return@

    一般情况下, 方法里面的lambda是不能return外部函数的.
    举例: 这是个普通的高阶方法, 带有一个lambda参数:
    
    fun fooNormal(body: () -> Unit) {
        println("normal start")
        body()
        println("normal done")
    }
    它被调用的时候, 如果想在lambda中直接return:
    
    fun main() {
        fooNormal {
            println("body 1")
            return // return is not allowed here
            return@fooNormal // return@fooNormal is allowed
        }

    1.3.4 reified
    类型参数具体化(T)具体化关键字:reified,用于泛型形参上,且函数要以inline修饰,而该函数不必须是一个高阶函数(即不必须使用函数作为参数)

    class SimpleClassTest {
        private inline fun <reified T> anyObject(): T {
            return Mockito.anyObject<T>()
        }
    }


    1.3.5 crossinline
        在内联函数中,可能没有直接调用lambda函数参数,而是通过一个局部对象中的函数,或其它函数来调用;这时在调用函数中可能包含非局部返回,这是不允许的,需要使用crossinline关键字,指明只能局部返回
        
        如,
        
        inline fun f(crossinline body: () -> Unit) {
            val func = Runnable {
                body()
            }
            //局部对象中调用
            object {
                fun funX() {
                    body()
                }
            }
            // ...
        }
        
        调用f():
        
        fun testF() {
            f {
                listOf(1).forEach(return@f)
        //        return@f
        
                println("ajajaj")
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值