Kotlin Reference: Type Checks and Casts
is and !is Operators 使用 is(和其否定形式 !is)可以在运行时检查某个对象是否符合给定的类型: [code lang=”kotlin”]if (obj is String) { print(obj.length) } if (obj !is String) { // same as !(obj is String) print(“N…
Read more
learn, build, evaluate
is and !is Operators 使用 is(和其否定形式 !is)可以在运行时检查某个对象是否符合给定的类型: [code lang=”kotlin”]if (obj is String) { print(obj.length) } if (obj !is String) { // same as !(obj is String) print(“N…
Read more
可以使用 rangeTo() 函数(对应操作符为 ..)编写区间表达式(Range Expression),并使用 in 和 !in 来补充。区间可以用于所有可比较的类型,但对于整型基本类型(Integral Primitive Type)的实现有优化。下面是一些使用区间的例子: [code lang=”kotlin”]if (i in 1..10) { // equi…
Read more
Kotlin 会区分可变(Mutable)和不可变(Immutable)集合(如 List、Set、Map 等),这一点与其他语言不同。通过对集合能否被修改进行精确的控制,有助于消除 Bug 和设计优良的 API。 首先,需要理解可变集合的只读视图(View)和一个真正不可变集合间的区别。二者都很容易创建,但在类型系统中并不会体现出区别,你可以根据实际需要来决定是否对二者进行区分。 K…
Read more
有时候需要把一个对象解构(Destructure)为一系列变量,如: [code lang=”kotlin”]val (name, age) = person[/code] 上面的语法称为解构声明(Destructuring Declaration),解构声明可以一次性创建多个变量。我们声明了两个变量:name 和 age,可以单独地使用它们: [code lang=&…
Read more
使用高阶函数会引入一定的运行时损耗:每一个函数都是一个对象,并且要获取闭包,即在函数内访问外部函数作用域的变量。(对函数对象和类的)内存分配和虚调用都会引入运行时开销。 但在很多情况下,使用内联 Lambda 表达式可以消除此种开销,下面给出的函数很好地展现了这一情况,即 lock() 函数可以很容易地在调用处内联,考虑下面的场景: [code lang=”kotlinR…
Read more
Higher-Order Functions 高阶函数指的是以函数作为参数或返回值的函数。lock() 函数是一个很好的例子,它接受一个对象和一个函数作为参数,获取对象的锁后,执行函数并释放锁: [code lang=”kotlin”]fun lock(lock: Lock, body: () -> T): T { lock.lock() try { return bo…
Read more
Function Declarations 在 Kotlin 中使用 fun 关键字定义函数: [code lang=”kotlin”]fun double(x: Int): Int { return 2*x }[/code] Function Usage 函数的调用和传统方法一样: [code lang=”kotlin”]val resul…
Read more
对于一些通用的属性,比起每次都在需要的时候进行手动实现,更好的方法是实现一次并把它放进库里,此类属性如: 延迟(Lazy)属性:仅在第一次访问时进行计算, 可观察(Observable)属性:属性发生变动时通知监听者, 在映射(Map)中存储属性,而不是把属性存储到单独的字段。 Kotlin 提供了委托属性(Delegated Property)来满足此种(及其他)场景: [code la…
Read more
实践证明,委托模式(Delegation Pattern)是实现继承的一种有效的替代方式,Kotlin 原生支持委托模式,不需要任何样板代码。下面的代码中,Derived 类实现了接口 Base,并将其所有的公有方法委托给了一个特定的对象: [code lang=”kotlin”]interface Base { fun print() } class BaseImpl…
Read more
有时候我们想对一个类进行些许修改,而又不想显式地声明一个新的子类。Java 使用匿名内部类(Anonymous Inner Class)的方式应对这种场景,Kotlin 使用对象表达式(Object Expression)和对象声明(Object Declaration)进一步拓展了这个概念。 Object expressions 要创建继承了某个(或多个)其他类型的匿名内部类,可以使用如…
Read more