Kotlin inline & infix

inline

内联函数

调用内联函数时,在编译期间,被定义的内联函数体的代码将被拷贝至每个调用方法体内。

优点:

取代默认的压栈调用,消除压栈、对象转换产生的内存分配、回调等开销

缺点:

编译后的代码膨胀,消耗更多内存空间

使用场景:

经常调用的高阶短函数

non-local control flow

内联函数中的内联lambda表达式中,return关键字将直接结束外部函数体,而非该lambda表达式或内联函数,该行为被称为非局部返回(non-local control flow)

noinline

在定义内联函数的参数列表中,指定不进行内联的 lambda 参数。

crossinline

在定义内联函数的参数列表中,指定内联但禁止return关键字(禁用non-local control flow功能)的lambda参数,通常该参数会被传递至另一高阶函数进行调用。

reified

具体化类型参数

在内联函数中,可以获取泛型的真实类型。

这是因为在编译期间,该泛型参数在代码拷贝中被解析成实参类型,从而避免了类型擦除过程。

当需要获取泛型参数的真实类型时,使用reified进行声明,此后可用于isasT::class等操作。

inline fun  List<*>.itemsAre(): Boolean =
        all { it is T }

contentList.itemsAre()

内联属性

inline可用于标记gettersetter或整个计算属性对象:

val foo: Foo
    inline get() = Foo()

var bar: Bar
    get() = ...
    inline set(v) { ... }

inline var bar: Bar
    get() = ...
    set(v) { ... }

坑:

内联函数体中不能直接访问其外部类的成员,需要声明所访问成员为internal并使用注解@PublishedApi标记

infix

中缀符号,用于两个对象间的运算

//定义中缀扩展方法
infix fun Int.do(x: Int): Int {...}
println(1 do 2)

你可能感兴趣的:(Kotlin inline & infix)