#if else 表达式 #range表达式 in A ..B #A until B 表示 [A,B)
#when表达式 #string模版 ${}
#TODO,Nothing函数抛异常,终止代码运行
#``反引号,解决任何语法冲突
#内联 inline (递归函数无法内联,因为会导致复制粘贴无限循环,编译会发出警告)
#函数引用 ::
#非空判断操作符 ?
#空合并操作符 ?:
#非空断言操作符 !!
#先决条件函数
checkNull 如果参数为null,则抛出llegalStateException异常,否则返回非null值
require 如果参数为false,则抛出llegalArgumentException异常
requireNotNull 如果参数为null,则抛出llegalStateException异常,否则返回非null值
error 如果参数为null,则抛出llegalStateException异常并输出错误信息,否则返回非null值
assert 如果参数为false,则抛出AsserError异常,并打上断言编译器标记
#字符串操作
1.subString subString(0 unit index)
2.split 拆分
3.replace 替换
4. == 内容比较 === 检查两个变量是否指向内存堆上同一对象
5.forEach遍历
#类型转换
1.安全转换函数 toIntOrNull()等等
2.roundToInt()四舍五入
3.精度 "%.2f".format()
#函数
1.apply 配置函数(针对接受者的隐式调用)返回当前接受者
2.let let会把接受者传给lambda,let返回lambda的最后一行
3.run 和apply差不多,run函数不返回接受者,run返回的是lambda结果
4.with 是run的变体,但是调用方式不同,调用with是需要值参作为其第一参数传入
5.also 功能与let类似,也是把接受者作为值参传给lambda,但是also返回接受者对象,而let返回lambda结果
6.takeIf 需要判断lambda中提供的条件表达式,给出true或者false结果,true返回接受者对象,false返回null
7.takeUnless takeIf的辅助函数,只有判断你给定的条件结果为false时,takeUnless才会返回原始接受者对象 (与takeIf刚好相反)
#List
1.getOrElse 安全索引取值函数(索引不存在代替异常)
2.getOrNull 安全索引取值函数(索引不存在返回null)
3. mutableListOf 可变函数
4.toList和toMutableList 动态实现只读列表和可变列表的相互转换
5.mutator 能修改可变列表的函数的统一名字
6. for in 遍历 forEach 遍历 forEachIndexed遍历时要获取索引
7. _ 解构过滤
#set
1.elementAt 读取集合中的元素
2.可变不可变和List一样
3.List转set去除重复元素 toSet 反之toList
4.distinct 去重快捷函数
#Map
1.mapOf("A" to "B") 或者 mapOf(Pair("A","B")) 创建
2.map["A"] map.getValue("A") map.getOrElse("A") {} map.getOrDefault("A","default") 读取
3.map.forEach{} map.forEach{(key: String, value: String) ->} 遍历
4.mutableMapOf("A" to "B") 可变map
#field
1.针对你定义的每一个属性,kotlin都会产生一个field、一个gettter、以及一个setter,field用来存储属性数据
#主构造函数 Player(){}
#次构造函数 constructor():this()
#初始化块 init{} 可以设置变量或值,以及执行有效性检查,初始化块代码会在构造类实例时执行
#初始化顺序
1.祝构造函数里声明的属性
2.类级别的属性赋值
3.init初始化块里的属性赋值和函数调用
4.次构造函数里的属性赋值和函数调用
#延迟初始化 lateinit
1.isInitialized 检查是否完成初始化
#惰性初始化 by lazy{}
#继承 open 修饰才能被继承,默认是不能被继承的
#重载 is 类型检测
#转换 as 类型转换
#超类 Any
#单例 object
#伴生对象 companion 将某个对象的初始化和一个类实例捆绑在一起,一个类里只能有一个伴生对象
#嵌套类 如果一个类只对另外一个类有用,那么将其嵌入到该类中并使这两个类保持在一起
#数据类 data 提供了toString、equals、hashCode以及copy的个性化实现
数据类使用条件:
1.数据类必须有至少带一个参数的主构造函数
2.数据类主构造函数的参数必须是val或者var
3.数据类不能使用anstract,open,sealed和inner修饰符
#解构声明 后台实现就是声明component1、component2等若干个组件函数 数据类会自动为所有定义在主构造函数的属性添加对应的组件函数
#运算符重载
1. + 函数名:plus
2. =+ 函数名:plusAssign
3. == 函数名:equals
4. [] 函数名:get
..........
5. in 函数名:contains
#枚举类 enum 用来定义常量集合的一种特殊类, kotlin中还可以定义函数
#代数数据类型 可以用来表示一组自类型的闭集,枚举类就是一种简单的ADT
#密封类 sealed class 对于复杂的ADT可以使用密封类来实现更复杂的定义,密封类可以有若干个子类,要继承密封类,且子类必须和它定义在同一个文件里
#接口 interface(单继承) 默认是open修饰的
#抽象类 abstract(多重继承)
#范型类 <T> 可以接受任何类型
#vararg关键字 可变参数,可以放多个 接收用Array<out T>
#out(协变) 如果泛型类只将泛型类型作为函数的返回(输出),那么使用out,可以称之为生产类/接口,因为它主要是用来生产(produce)指定的泛型对象
1.子类泛型对象可以赋值给父类泛型对象,用out
#in(逆变) 如果泛型只将泛型类型作为函数的如惨(输入),那么使用in,可以称之为消费类/接口,因为它主要是用来消费(cunsume)指定的泛型对象
1.子类泛型对象可以赋值给父类泛型对象,用in
#invariant(不变) 如果泛型类既将泛型类型作为函数参数,又将泛型类型作为函数的输出,那么依不用out也不用in
#reified 可以检查泛型参数类型,kotlin不允许对泛型参数T做类型检查,因为泛型参数类型会被类型擦除
#infix 适用于有单个参数的扩展和类函数,可以用更简洁的语法调用函数,使用infix关键字时,接受者和函数之间的点操作以及参数的括号都可以不要
# T.() 带接受者的函数字面量
#函数类别 一个函数式应用通常由三大类函数构成:变换transform、过滤filter、合并combine.美类函数都针对集合数据类型设计,目标式产生一个最终结果
#变换函数
1.map变换函数会遍历接受者集合,让变换器函数作用域集合里都各个元素,返回结果是包含已修改元素的集合,会作为链上下一个函数都输入.
2.flatMap函数操作一个集合的集合,将其中多个集合中的元素合并后返回一个包含所有元素的单一集合.
#过滤函数(过滤函数接受一个predicate函数,用它按给定条件检查接受者集合里定元素并给出true或者false的判定,ture受检函数添加,false受检函数移除)
1.filter
#合并函数(能将不同的集合合并成一个新集合,这和接受者是包含集合的flatMap函数不同)
1.zip合并函数,来合并两个集合,返回一个包含键值对的新集合
2.fold合并函数,接手一个初始累加器值,随后会根据匿名函数的结果更新
#序列
1.generateSequence 针对某个序列,你可能会定义一个只要序列有新值产生就被调用一下的函数,这样的函数叫迭代器函数,
generateSequence函数接收一个初始种子值做为序列的起步值,在用generateSequence定义的序列上调用一个函数时,
generateSequence函数会调用你指定的迭代器函数,决定下一个要产生的值.
#注解
1.@JvmName 指定编译类的名字
2.@JvmField 暴露它的支持字段给java调用者,从而避免使用getter方法,还能用来以静态方式提供伴生对象里定义的值.
3.@JvmOverloads 协助产生kotlin函数的重载版本.设计一个可能会暴露给java用户使用的API时,记得使用@JvmOverloads注解
4.@JvmStatic 作用类似于@JvmField,允许你直接调用伴生对象里的函数.
5.@Throws 抛出一个需要检查的指定异常,java和kotlin有关异常检查的差异让@Throws注解给解决掉了
#函数类型操作 java中调用kotlin时,任何时候需要调用一个函数类型,都要它调用invoke