美文网首页
《Kotlin 实战》 - 2 Kotlin 基础

《Kotlin 实战》 - 2 Kotlin 基础

作者: Ronnie_火老师 | 来源:发表于2019-06-17 20:15 被阅读0次

    2.1 基本要素 函数和变量

    • if 是有结果值的表达式,类似于 Java 中的三元运算符
    • 表达式函数体:函数体由单个表达式构成(并不是单行):
          fun max(a: Int, b: Int) = if(a > b) a else b
      
      • 函数体写在花括号中,称为代码块体;如果直接返回一个表达式,称为表达式体;
      • 只有表达式体函数的返回类型可以省略,对于有返回值的代码块体,必须显式的写出返回类型和 return 语句。

    2.2 类和属性

    • 类属性直接写在类名后的 () 内,代替了 java 中的带参构造函数及参数赋值操作
    • 值对象是指只有数据没有其他代码的类:
          class Person (val name: String)
      
    • 修饰符省略时,public 是默认可见性
    • 在 kotlin 中,属性是头等的语言特性,等同于 Java 中的 字段 + 访问器(getter/setter),所以声明属性时,也就声明了对应的访问器,如果有需要,可以自定义访问器;
    • 声明为 val 的属性是只读的(一个字段 + 一个简单的 getter), var 属性是可变的,(一个字段 + 一个 getter + 一个setter)
    • 重新看上面 Person 类声明代码,看上去简单,其实隐藏了和 Java 相同的底层实现,
      即,该类拥有一个私有字段,在构造方法中被初始化,并通过 getter 对外暴露。
      • java 中访问 name:person.getName()
      • kotlin 中访问 name: person.name
      • kotlin 中看上去好像是直接访问属性,其实调用的还是 getter
    • 也可以自定义访问器,常用于“不需要一个单独字段存储信息,随时通过简单运算来获取”,示例:
          val isSquare: Boolean
              get() {
                  return height = width;
              }
      
      • 这里涉及到一个 无参函数 与 自定义 getter 优劣问题,其实二者唯一差别是可读性,如果涉及到类的特征,应该声明为属性。
    • import 不仅可用于类,也可用于顶层函数
    • 可以把多个类放在同一个文件中,文件的名字可以随意选择。

    2.3 枚举和when

    • kotlin 中有“软关键字”,enum 就是,只有出现在 class 前面才表示枚举,出现在其他位置就是普通名称。
    • when 类似于 Java 中的 switch,但比 switch 强大的多,分支用 -> 表示判断,而且也不需要每个分支写 break
    • when 是有返回值的表达式,因此可以写直接返回 when 表达式的表达式体函数
    • 可以使用不带参数的 when,也可以在 when 结构中使用任意对象

    2.4 迭代事物:while 循环和 for 循环

    • while 循环和 java 一样
    • for 循环只有一种方式,类似于:for (i in <区间>),这里的区间也包含了集合(List)
    • 区间默认是闭合(包含结束值)的,可以使用 ..、downTo、step、until(不包含结束值的半开区间) 等创建区间或者改变区间的方向和步长,步长也可以是负数
      • 举例:
        for(i in 'A' until 'Z' step 2)

    2.4.3 迭代 Map

    • 常见形式:
    for((key, value) in map)
    
    • 可以使用类似方式在迭代集合的同时跟踪当前项下标,举例:
    val list= arrayListOf("10","11")
    for((index,element) in list.withIndex()){
        println("$index: $element")
    }
    
    // 输出
    0: 10
    1:11
    

    小技巧:对于 List 来说,使用 listof(), arrayListOf(x,x) 等初始化; 对于 map,可以使用 map[key] 读取值,使用 map[key] = value 设置值

    2.4.4 使用 in 检查集合和区间的成员

    • 使用 in 或者 !in 检查一个值是否 在/不在 区间中
      • c in 'a'..'z'
    • 区间不仅限于数字和字母,可以是实现了 java.lang.Comparable 接口的任意类,如:
      • println("Kotlin" in "Java".."Scala")将会输出 true,字符串是按照字母表顺序进行比较的,因为 String 就是这样实现 Comparable 接口的。

    2.5 Kotlin 中的异常

    • 与 Java 不同的是,Kotlin 中不区分“受检异常”(强制要求捕获的异常,如 IOException)和“未受检异常”,所以 Kotlin 中函数后面不再有 throws 子句了。
    • try 也是表达式,可以直接将 try catch 赋给一个变量,当正常结束时,try 最后一条语句就是返回值,当抛出异常时,catch 最后一条语句就是返回值。

    2.6 小结

    • fun 关键字用来声明函数。 val 关键字和 var 关键字分别用来声明只读变量 和可变变量。
    • 字符串模板帮助你避免烦琐的字符串连接。在变量名称前加上前缀或者用{}包围一个表达式,来把值注入到字符串中 。
    • 值对象类在 Kotlin 中以简洁的方式表示。
    • 熟悉的 if 现在是带返回值的表达式。
    • when 表达式类似于 Java 中的 switch 但功能更强大。
    • 在检查过变量具有某种类型之后不必显式地转换它的类型:编译器使用智能
      转换自动帮你完成。
    • for, while 和 do-while 循环与 Java类似,但是 for 循环现在更加方便,
      特别是当你需要法代 map 的时候,又或是迭代集合需要下标的时候。
    • 简洁的语法 1..5 会创建一个区间。区间和数列允许 Kotlin 在 for 循环中使用统一的语法和同一套抽象机制,并且还可以使用 in 运算符和 !in 运算符
      来检查值是否属于某个区间。
    • Kotlin 中的异常处理和 Java 非常相似,除了 Kotlin 不要求你声明函数可以抛出的异常。

    相关文章

      网友评论

          本文标题:《Kotlin 实战》 - 2 Kotlin 基础

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