Kotlin学习笔记之 1 基础语法

《Kotlin学习笔记之 1 基础语法》

首发于公众号: DSGtalk1989

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

    原文作者:super_shanks
    原文地址: https://www.jianshu.com/p/54f7b186f209
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞