1,typealias 声明一个类型别名。
样例:
typealias MyBean=ItemBean
data class ItemBean(val title: String, val intent: Intent)
val bean=MyBean("11", Intent())
实现了将ItemBean数据模型取了一个别名MyBean,后续我们可以像使用别名一样使用他们
2,crossinline 禁止传递给内联函数的 lambda 中的非局部返回。
样例:
private inline fun textCrossInline(crossinline value:()->Unit){ value() } override fun afterInitView() { super.afterInitView() textCrossInline { return//直接报错,说不能这么返回 } }
如果改成下面这样就可以
private inline fun textCrossInline(value:()->Unit){ value() }
3,expect 将一个声明标记为平台相关,并期待在平台模块中实现。
用于实现声明函数或者接口或者抽象类,但是具体实现在具体对应的平台上面
4,infix 允许用中缀表示法调用函数,使函数的调用方式更加简介和个性化
样例:
infix fun String.plusjdz(value:String):String{ return (this.hashCode()+value.hashCode()).toString() }
println("a" plusjdz "b")
5,internal 将一个声明标记为在当前模块中可见。
6,noinline 关闭传给内联函数的 lambda 表达式的内联。
和inline关键字不同之处在于,noinline是给lambda表达式的参数标记的,inline标记函数,编译器会默认把所有lambda参数都到对应位置展开,而有的lambda参数不想内联怎么办?
被noinline标记的参数会默认不内联,也就是说把完整的函数调用保留下来;
7,tailrec 将一个函数标记为尾递归(允许编译器将递归替换为迭代)。
它是通过编译器对递归调用做了优化,减少了出现栈溢出风险
tailrec fun sums(a:Int,initValue:Int):Int{ if (a==0)return initValue return sums(a-1,initValue+a) }
反编译优化后的字节码:
public final int sums(int a, int initValue) { while(a != 0) { int var10000 = a - 1; initValue += a; a = var10000; } return initValue; }