Kotlin学习笔记之 1

作者: super_shanks | 来源:发表于2019-03-05 13:10 被阅读12次

    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

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