- 字符串
- 字符串查找
- str.first()
- str.last()
- str.indexOf()
- str.lastindexOf()
- 字符串截取的区别
- subString(3)
- subString(3,7)
- subString(IntRange(3,7))
- 字符串的替换
- subString.replace("Hello",‘aaa‘) 替换字符串中的所有hello
- subString.replaceBefore(‘!‘,‘bbb‘)
- subString.replaceAfter(‘!‘,‘aaa‘)
- 可以在后面添加添加First和Last
- 字符串的分割
- split()
- 参数内可以可以填写多个分隔符,会返回一个数组
- 字符串的空格
- trimStart()
- trim()
- trimEnd()
- trimIndent() """ 原样输出后面加这个函数 """
- 代码 循环相关的规范,优先使用普通for循环
- forEach语句
- 一些可迭代集合拥有,可以打印出元素,内部包含it变量,用于表示当前元素值
- arr.forEach {
- }
- forEachIndex语句
- break
- 默认是跳出内层循环,后面的循环都不会执行
- 跳出外层循环,可以给外层循环打一个标记,比如说:
- continue
- 数组
- 定义方式
- 数字类型的数组,可以避免大批量处理数据时的装箱,拆箱
- var my_arr:IntArray=intArrayOf(1,2,3)
- String类型,包装类定义方法
- var my_string:Array<String>=arrayOf(‘1‘,‘2‘,‘3‘)
- 遍历
- 在kotlin中遍历数组,推荐使用的是for循环,而不是forEach
- 带下标的遍历
- for((index,i) in arr.widthIndex()){ //其中index表示取到的index,i表示取到的item}
- 求最值
- 可以利用算法求
- 可以利用.max(),.min()来求
- 修改值
- 1.利用数组中的下标操作符来修改值
- 2.利用数组的set函数修改,set(index,newValue)
- 查找角标
- 数据类型转换
- 类型检查
- is关键字可以做到类型检查,编译器在发现is关键字的时候
- 任何类型的最终父级都是Any,
- 可以使用as关键字进行强制类型转换 10 as String,成功则会返回一个String类型的10
- 如果错误会发生异常
- 更安全的做法: 在as关键字后添加?
- eg: as?
- 可以转换时返回转换后类型的值
- 不能转换时返回null
- 空值处理
- Int和String类型默认是非空的,如果想要为可空
- Int? 和String?
- 上述两个也是Kotlin的类型,和Int,String唯一的区别就在于它们的值可空
- 默认情况下,当非空运算
- 比如说arr.length中,如果arr为null,那么就会报错
- 想要不报错,并返回null,就变量名后加问号arr?.length
- 有时候,我们不想返回空值,我们想当值为null时,返回自己自定义的值
- arr?.length?:-1
- 解释:?表示为空吗 ,如果是,就打个冒号,后面跟上你想返回的值
- 有时候,因为一些函数,或属性,在判断arr可能为空时,会强制报错,这个时候我们需要显示的告诉编译器,这里不为空
- arr!!.length
- 但假如arr真的为null,还是会产生空指针异常
- 集合类
- 对于Kotlin来说,有value,和key-value两种
- 第一种Collection接口,第二种是Map接口,继承自Iterator接口
- Mutable接口,表示可变,意思是可以添加
- 数组使用length,集合类都使用size
- 方法:
- mutableListOf()
- mutableSetOf()
- mutableMapOf()
- Map接口
- val map = mapOf(1 to "小小白",2 to "江小小")
- 获取属性+for循环
- map.keys
- map.values
- map.entries
- MutableMap
- clear清空
- put添加
- remove删去
- size 大小
- set修改
- 泛型
- 编译时一种安全机制
- 我们不太确定是什么类型的时候,就用<T>来表示,到实际确定的时候,再定义即可
- 你就把泛型当作普通的类型来书写就可以,泛型的本质就是类型参数
- 泛型类在使用的时候,必须指定,把参数实例化
- 例外:泛型类和泛型接口的继承
- 可以直接指定类型参数,把T变为具体类型来继承
- 也可以不指定,延用之前的类型参数,但此时,子类必须也是一个泛型类
- 泛型方法
- 定义方式 fun<T> Hello(t:T)
- 在fun关键字后就可以定义泛型,泛型继承自哪个类,可以使用:
- 必要性
- 比如对集合中进行相加,就不能在集合中存String
- 所以泛型<T:Number> 应该是Number类自己或它的子类
- <T:Any?>和<T:Any> 并不同,因为Any是Any?的子类
- 泛型擦除
- 泛型的协变和逆变 ,点变形
- in 逆变 可以在原来确定的类型的基础上,使用各种父级类型
- out 协变 可以在原来确定的类型的基础上,使用子级类型
- 优势,增强了实现泛型在使用时的灵活性,扩大了泛型的内涵
- petShop:PetShop<in/out Animal>
- 不能在泛型定义时,使用点变形
- 泛型投射(通配符)
- 当必须使用泛型方法/类/接口,却又未确定泛型时,可以使用泛型投射
- class my_Number_List:LIst<*>
- *号表示该泛型可以表示任意类型,或者说,就是Any?
- 实化类型
- 有时候必须要获取泛型实现时的具体取值,此时应该使用inline class/fun/interface+ <reified T>
- inline:内联
- reified:真实
- 这样就可以获取泛型参数的类型了
Kotlin入门(2)
原文:https://www.cnblogs.com/frontend-tutorial/p/13584029.html