kotlin基础语法

166 阅读7分钟

#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         安全索引取值函数(索引不存在返回null3. 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