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 不要求你声明函数可以抛出的异常。
网友评论