美文网首页
Kotlin学习笔记

Kotlin学习笔记

作者: 玖玖君 | 来源:发表于2019-07-08 10:08 被阅读0次

    1.基础语法

    • 方法描述

      fun methodName(type1 : Type, type2 : Type2) : returnType{}
      
      fun methodName(type1 : Type, type2 : Type2) : Unit {
          type1 = type2
      }
      
      
    • 变长参数 vararg

      fun methodName(vararg v : Int){
          //此处v是个数组
          for(nv in v){
             print(v)
          }
      }
      
      

      类似于 java中的 ...

      //主函数   数组类型的
      fun main(args : Array<String>){
      
      }
      
      
    • lambda 匿名函数

      fun main(args : Array<String>){
        //(传参类型1, 传参类型2) -> 返回类型 = { 具体参数1, 具体参数2 -> 返回参数}
        val plus : (Int, Int) -> Int = { x,y -> x+y}
        println(plus(1,2))
      }
      
      
    • var 可变 val 不可变

      有一个非常有意思的现象,kotlin自带属性判断功能,即你不指定具体的数据类型,kotlin可以帮你分析出你想要什么。比如说:

      //i被判断成Int
      var i = 123
      //s被判断成String
      val s = "123"
      
      
    • String 字符串中直接引入参数和方法

      //$符号之后跟{}表示方法,跟参数名表示引用参数
      val s = "${a.replace("ss", "ww")}, and then it is $a"
      
      

      想要直接的去使用字符$,我们一般也是借助$去实现,因为$没有相应的转义符

      val s = "${`$`}, is this"
      
      
    • 关于空

      //这边我们可以直接把String? 看成是一种类型,解释为可以为空的String类型
      //可能会有疑问既然s已经被val描述,是final类型的了,还会出现可能为空的String
      //因为虽然你不能再对s赋值了, 但是你依然可以改变非赋值的方式改变它,比如replace什么的等等
      val s : String? = "23"
      
      //一旦s为空就报错
      val a = s!!.toInt()
      //一旦s为空,可以继续执行不报错,并且此处的b为null
      var b = s?.toInt()
      //b为null之后,我们紧接着调用b的其他的方法,产生的也是null,并且不会报错,这就是强大的kotlin容错机制
      var c = b.toString()
      //? 和 ?: 的判断表示如果为空的话,那么就返回后面的内容
      //此处的有需要多说一句,一旦为空的情况,那么后面想给什么就给什么,无论字符串还是整型等等,kotlin均可以自动识别,跟你前面想要的类型没有关系
      var d = b?.toString() ?: "123"
      
      //此处需要注意,一旦是有可能出现为空的类型,kotlin就会在适当的时候通知到你
      var h = s?.toInt()
      var i = 1
      //此时由于h很有可能为空,因此kotlin会提示你不允许直接使用*操作符,而是要使用times方法进行?操作
      var j = h * j    
      //即如下这样,times方法在kotlin中被用来做乘法的使用
      var j = h?.times(j)
      
      
    • 类型检测

      kotlin 中使用 is 来代替使用 isinstanceOf

      kotlin 中不存在Object类,通常这个方法可以传入任何数据类型,kotlin直接使用 Any

       fun getLength(s : Any){
          if(s is String){
             println(s.length)
          }
       }
      
      
    • 范围

      java中使用的是 for(int i = 0; i < n; i++)

      kotlin中比较方便,直接使用 for(i in 1..n)

      ..针对任何可以进行比较的数据类型,比如 for(c in '0'..'9'),正对整形有单独优化,一般使用比较多的就是整型,并且对顺序有要求,只能从小到大

      for(i in 4..1) 不会进到for循环来,因为4无法走到1

      针对从高到低的情况,要使用到downTo for(i in 4 downTo 1)

      for(i in 1..4 step 2) ==== for(int i = 1; i <= 4; i = i + 2) 最终出来的是1,3

      ..和downTo都是包含边界数字的闭集[],如[1,4],如果想要开集,需要使用到until描述符

      for(i in 1 until 10) ====== [1, 10) 但是由于局限性,until也只能用在从小到大的并且只能做右边的开集,能用until,就尽量不去使用1..n-1

      范围既可以用在for循环中也能用在if条件判断中

      比如 if (i in 1..4) 1 <= i <= 4 if(c in '0'..'9') '0' <= c <= '9'

      补充(1) 范围之外直接使用 !in

      if(i !in 1..4)  
      
      

      即 i 不在 1~4之间

      补充(2) 结合when来判断,数组中是否存在某元素

      when{
         "a" in items -> {}
         "b" in items -> {}
      }
      
      
    • with

      kotlin中我们可以借助with来进行连续调用方法

      class Turtle {
            fun penDown()
            fun penUp()
            fun turn(degrees: Double)
            fun forward(pixels: Double)
        }
      
        val myTurtle = Turtle()
        with(myTurtle) { // 画一个 100 像素的正方形
            penDown()
            for(i in 1..4) {
                forward(100.0)
                turn(90.0)
            }
            penUp()
        }
      
      
    • java7 try with resources

      java7中的特性,只要是实现了closeable的在使用完成之后需要释放资源的类,会在try代码体执行完成之后释放掉资源,在kotlin中我们一般使用use方法,规定为只要实现了closeable接口的都有这个方法,意思为use了之后就会释放自己的资源

      //java7
      try(BufferedReader br = new BufferedReader(new FileReader(path))){
         return br.readLine();
      }
      
      //kotlin
      var bufferedReader = BufferedReader(FileReader("path"))
        bufferedReader.use { 
            print(it.readLine())
        }
      
      
    • 注释习惯使用[]而非@param @return

      除非需要做特长的单独性说明,一般我们直接使用[]

      /**
         * Returns the absolute value of the given [number].
         */
        fun abs(number: Int) = ……
      
      
    • 能用val不用var,一般用最基本不可变集合

      valvar不做过多解释了,此处的不可变集合指的是Set``List``Map,优先使用这些,而不是优先使用HashSet``ArrayList``HashMap

    • 条件语句优先级

      二元首选if,其次再用when

    • 循环语句优先级

      优先使用高阶函数,filter``map这种,需要单独处理的我们用for,除非在链式中调用

    • 能属性不用函数

      底层算法会优先使用属性,而不是函数。所以如果是没有参数的方法,可以直接用属性替代。

    • 强转操作符 as

      java中的强转是在对象前加上括号类型的方式,kotlin中是通过as进行强转的。

      一般我们为了避免出现castException或者空指针的情况,直接使用 ?as来进行强转。


    Kotlin学习笔记之 1 基础语法

    Kotlin学习笔记之 2 基本数据类型

    Kotlin学习笔记之 3 条件控制

    Kotlin学习笔记之 4 循环控制

    Kotlin学习笔记之 5 类和对象

    Kotlin学习笔记之 6 继承

    Kotlin学习笔记之 7 接口

    Kotlin学习笔记之 8 扩展

    Kotlin学习笔记之 9 数据类与密封类

    Kotlin学习笔记之 10 泛型

    Kotlin学习笔记之 11 枚举类

    Kotlin学习笔记之 12 对象表达式和对象声明

    Kotlin学习笔记之 13 基础操作符run、with、let、also、apply

    Kotlin学习笔记之 14 包与导入

    Kotlin学习笔记之 15 伴生对象

    Kotlin学习笔记之 16 委托

    Kotlin学习笔记之 17 可观察属性

    Kotlin学习笔记之 18 函数

    Kotlin学习笔记之 19 高阶函数与 lambda 表达式

    Kotlin学习笔记之 20 内联函数

    Kotlin学习笔记之 21 解构声明

    Kotlin学习笔记之 22 集合

    Kotlin学习笔记之 23 相等判断

    Kotlin学习笔记之 24 操作符重载

    Kotlin学习笔记之 25 异常捕捉

    Kotlin学习笔记之 26 反射

    Kotlin学习笔记之 27 类型别名

    Kotlin学习笔记之 28 协程基础

    Kotlin学习笔记之 29 上下文与调度器

    Kotlin学习笔记之 30 协程取消与超时

    Kotlin学习笔记之 31 协程挂起函数的组合

    Kotlin学习笔记之 32 协程异常处理

    Kotlin学习笔记之 33 协程 & Retrofit

    相关文章

      网友评论

          本文标题:Kotlin学习笔记

          本文链接:https://www.haomeiwen.com/subject/jkbnhctx.html