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