一、关键字
1.“is”
在Kotlin中, is检查来判断一个变量是否是某种类型。
is检查和Java中的instanceOf相似。
但是在Java中,如果你已经检查过一个变量是某种类型并且要把它当作这种类型来访问其成员变量时,在instanceOf检查之后还需要显式地加上类型转换。
如果最初的变量会使用超过一次,常常选择把类型转换的结果存储在另一个单独的变量里
在Kotlin中,编译器会帮你完成了这些工作。如果你检查过一个变量是某种类型,后面就不再需要转换它,可以就把它当作你检查过的类型使用,我们把这种行为称为智能转换。
智能转换只在变量经过is检查且之后不再发生变化你的情况下有效。
当你对一个类的属性进行智能转换的时候,这个属性必须是一个val属性,而且不能有自定义的访问器。否则,每次对属性的访问是否都能返回同样的值将无从验证。
2.迭代数字:区间和数列
Kotlin使用区间的概念
区间本质上就是在两个值之间的间隔,这两个值通常是数字:一个起始值,一个结束值。使用 ..运算符来表示区间:
val oneToTen = 1 .. 10
注意Kotlin的区间是包含的或者闭合的,意味着第二个值始终是区间的一部分。
- 迭代带步长的区间
for (i in 100 downTo 1 step 2)
100 downTo 1是递减的数组(步长为-1)。然后step把步长的绝对值变为了2,但方向保持不变(实际上,步长被设置为了-2)
二、Lambda表达式
{x: Int, y: Int -> x + y}其中参数:x: Int, y: Int
函数体:x + y
lambda表达式始终用花括号包围。注意实参并没有用括号括起来。箭头把实参列表和lambda的函数体隔开。
- 库函数run的使用
run { println(42) }run函数:把一小段代码封闭在一个代码块中,并使用run函数还执行传给它的lambda
- lambda简化讲解
(1)Kotlin有这样一种语法约定:如果lambda表达式是函数调用的最后一个实参,它可以放到括号的外边。
people.maxBy({ p: Person -> p.age })
改写为:
people.maxBy() { p: Person -> p.age }(2)lambda是函数唯一的实参时,还可以去掉调用代码中的空括号对:
people.maxBy { p: Person -> p.age }(3)和局部变量一样,如果lambda参数的类型可以被推导出来,就不需要显式地指定它。
以这里的maxBy函数为例,其参数类型始终和集合的元素类型相同,因而可以省略。
people.maxBy { p -> p.age }
(4)如果当前上下文期望的是只有一个参数的lambda且这个参数的类型可以推断出来,就会生成这个名称。
people.maxBy { it.age }仅在实参名称没有显式地指定时这个默认名称才会生成。