Android

二、Kotlin 语言基础

2018-01-22  本文已影响0人  Tenderness4
  1. 变量以及类型推断

    • var 是可变变量,val是不可变,仅能一次赋值

    • 定义变量

      val c:Int = 1 //c为常量 Int类型 值为1 var定义类似

    • 大部分情况下,不需要你使用对象类型定义,编译器可以直接推断出它的类型

        val a =  1 //自动推断出为Int
        a = 2 //error
        var b = 1
        b = 2 //true
      
    • 使用is运算符进行类型检测

          fun getLength(obj:Any):Int?{  
            var result = 0
            if(obj is String){
                println(obj::class)
                result = obj.length//如果在if分支上成立,将自动转换为String类  型
            }
         return result
        }
      
  2. 字符串与其模板表达式

    • 原始字符串(raw string)由三重引号(""")分隔。原始字符串可以包含换行符和任何其他字符
  3. 流程控制语句

    • 流程控制语句就和Java区别不大,语言共性,但是Kotlin还可以有一些简单的写法

        1.if 表达式
        val max = if (a >b) a else b//对应与java里三元表达式true?1:0
        val max = if(a>b){
                   println("Max is a")
                   a
               }else{
                  println("Max is b")
                  b
               }
      
        2.when 表达式,可以用于任意表达式
        fun switch(x:Int){
        val s = "123"
        when (x) {
            -1,0 -> print("x == -1 or x == 0")
            1 -> pritn("x == 1")
            2 -> print("x == 2")
        8 -> print("x is 8")
        parseInt(s) -> println("x is 123")
            else -> print("x is neither 1 or 2")
           }
        }
        或者
        val x = 1
        val validNumbers = arrayOf(1,2,3)
        when (x) {
          in 1..10 -> print("x is in the range")
          in validNumbers -> print("x is valid")
          !in 10..20 -> print("x is outside the range")
          else -> print("none of the above")
        }
        3.while、break、continue、return和java一样
      
    • return相对于Java,返回值可以是函数,return可以省略,直接用=代替

        1.
        val sum = fun(a:Int,b:Int) = a+b
        sum -->>类型是Int型
        想要得到结果可以这样写 sum(1,1)
        2.
        val sum = fun(a:Int,b:Int) = {a+b}
        sum -->>类型是函数 (..,..) -> Kotlin.Int
        想要得到结果,调用sum(1,1).invoke()
      
    • 标签

        显示标签
        fun returnDemo_1(){
            val intArray = intArrayOf(1,2,3,4,5)
            intArray.forEach here@{
                if(it == 3) return@here //跳转到lambda表达式标签here@处
            }
        }
        隐式标签,与接受该lambda函数同名
        fun returnDemo_2(){
            val intArray = intArrayOf(1,2,3,4,5)
            intArray.forEach{
                if(it == 3) return@forEach //作用和上面显示一样
            }
        }
      
    • throw表达式 ,它的类型是特殊类型:Nothing,与C、Java中的void意思一样,无法当作擦承诺书传递

  4. 语法与标识符

    • 修饰符

      • 常见的修饰符有public(默认的) internal protected priate suspend tailrec data sealed open lateinit(用于非空的var类型上,lazy用于val类型上)
    • 相等与不等

      • 引用相等 === ,不等 !==
      • 结构相等 == ,不等!=
      • a==b 可以写成 a?.equals(b) ?: (b===null)
    • infix 函数自定义中缀操作符

        infix fun String.grow(years:Int):String{
            return this +"生长了"+years.toString()+"年"//如果写成years+"...."将会报错,这和Int的运算符plus有关,它的参数没有String类型
        }
        "小明" grow 10
        -->>小明生长了10年
      
    • 扩展函数

      例如我们为String类型扩展一个notEmpty()函数

        fun String.notEmpty():Boolean{
            return !this.isEmpty(
        }
        >>> "".notEmpty()
        false
      
    • 扩展属性

      对于扩展的属性来说,它的行为只能由显示提供的getters/setters定义

        val <T> List<T>.lastIndex:Int get() = size -1
      
  5. 空指针安全

    • Java中NPE是一件很令程序员头疼的事,Kotlin针对这个问题作了改进

      var a:String?="abc"//定义一个可空String类型
      na = null//如果a定义为 var a:String = "abc",此处将报错
      na.length//会提示报错
      na?.length//正确写法 安全调用
      na!!.length//正确写法 非空断言调用
      再比如:
      val listWithNulls:List<String?> = listOf("A","B",null)
      listWithNulls.forEach{
          it?.let{println(it)}
      }
      输出:A
           B
      

这一节主要是写Kt的基础,预热,下一节再介绍基本数据类型和类型系统

上一篇下一篇

猜你喜欢

热点阅读