Kotlin非常用关键字使用记录

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;
}
相关推荐
raindayinrain10 分钟前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
驰骋工作流17 分钟前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
学逆向的19 分钟前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao24 分钟前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
学逆向的1 小时前
C 局部静态变量
c语言·开发语言·网络安全
大都督会赢的2 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”2 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
小王C语言2 小时前
Qt常用控件:容器类控件,标题分组框、标签页(浏览器标签)
开发语言·qt
传奇开心果编程2 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
我是唐青枫3 小时前
Kotlin Delegation 委托详解
开发语言·kotlin