首页 > 其他 > 详细

Kotlin入门(2)

时间:2020-08-30 09:17:02      阅读:67      评论:0      收藏:0      [点我收藏+]
  • 字符串
    • 字符串查找
      • 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 {
        • println(it) it是当前变量的意思
      • }
    • forEachIndex语句
  • break
    • 默认是跳出内层循环,后面的循环都不会执行
    • 跳出外层循环,可以给外层循环打一个标记,比如说:
      • @aaa for(i in x..y)
        • for(j in 1...i){
          • break @aaa
        • }
  • 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)
    • 查找角标
      • indexOf()
      • lastIndexOf()
  • 数据类型转换
    • 类型检查
      • 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接口,表示可变,意思是可以添加
      • 没有实现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>
        • petShop是PetShop的实例
      • 不能在泛型定义时,使用点变形
    • 泛型投射(通配符)
      • 当必须使用泛型方法/类/接口,却又未确定泛型时,可以使用泛型投射
      • 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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!