二、Kotlin 语言基础

  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的基础,预热,下一节再介绍基本数据类型和类型系统

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容