美文网首页Android
二、Kotlin 语言基础

二、Kotlin 语言基础

作者: Tenderness4 | 来源:发表于2018-01-22 22:53 被阅读0次
    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的基础,预热,下一节再介绍基本数据类型和类型系统

    相关文章

      网友评论

        本文标题:二、Kotlin 语言基础

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