Kotlin Reference: Null Safety

Nullable types and Non-Null Types   Kotlin 的类型系统致力于从代码中消除空引用的风险(又名 The Billion Dollar Mistake)。   在包括 Java 在内的很多语言中,一个最常见的陷阱就是访问一个空引用的成员,继而导致空引用异常,等效于 Java 中的 NullPointerException,缩写为 NPE。   Kotlin 的类…
Read more

Kotlin Reference: Operator overloading

  Kotlin 允许我们为类型上的一组预定义的操作符提供实现。这些操作符具有固定的符号表现形式(如 + 或者 *)和固定的优先级。可以通过固定名称的成员函数或扩展函数来为对应类型(二元操作符左值的类型,或一元操作符的参数类型)提供操作符的实现。重载操作符的函数需要使用 operator 修饰符标记。   下面描述了重载不同操作符的约定。 Unary operations Unary prefix…
Read more

Kotlin Reference: Equality

  Kotlin 中有两种类型的相等: 引用相等(两个引用指向同一个对象) 结构相等(检查 equals()) Referential equality   使用 === 操作(及对应的否定形式 !==) 检查引用相等。当且仅当 a 和 b 指向同一个对象时,a === b 的值为 true。 Structural equality   使用 == 操作(及对应的否定形式 !=) 检查结构相等。按…
Read more

Kotlin Reference: This Expression

  使用 this 表达式表示当前的接收者(Receiver): 在类的成员中,this 指的是该类的当前的对象。 在扩展函数 和 带接收者的函数字面值 中,this 指的是在点(.)左边传递的接受者参数。   如果 this 不具有限定词,则它指的是自身所在的最内层的作用域。如果要引用外层作用域,则需要使用标签限定符(Label Qualifier): Qualified this   如果想要…
Read more

Kotlin Reference: Type Checks and Casts

is and !is Operators   使用 is(和其否定形式 !is)可以在运行时检查某个对象是否符合给定的类型: Smart Casts   在 Kotlin 中,很多情况下并不需要使用显式的转换操作符,因为编译器会记录对不可变(Immutable)值的 is 检查结果,并在需要时自动插入(安全的)转换:   如果否定的检查会导致返回,编译器也聪明到可以判断转换是否安全:   又或者转…
Read more

Kotlin Reference: Ranges

  可以使用 rangeTo() 函数(对应操作符为 ..)编写区间表达式(Range Expression),并使用 in 和 !in 来补充。区间可以用于所有可比较的类型,但对于整型基本类型(Integral Primitive Type)的实现有优化。下面是一些使用区间的例子:   整型区间(IntRange、LongRange、CharRange)有一个额外的功能:它们可以被迭代。编译器会…
Read more

Kotlin Reference: Collections

  Kotlin 会区分可变(Mutable)和不可变(Immutable)集合(如 List、Set、Map 等),这一点与其他语言不同。通过对集合能否被修改进行精确的控制,有助于消除 Bug 和设计优良的 API。   首先,需要理解可变集合的只读视图(View)和一个真正不可变集合间的区别。二者都很容易创建,但在类型系统中并不会体现出区别,你可以根据实际需要来决定是否对二者进行区分。   K…
Read more

Kotlin Reference: Destructuring Declarations

  有时候需要把一个对象解构(Destructure)为一系列变量,如: 上面的语法称为解构声明(Destructuring Declaration),解构声明可以一次性创建多个变量。我们声明了两个变量:name 和 age,可以单独地使用它们:   解构声明会编译为如下的代码: 这里的 component1() 和 component2() 函数是在 Kotlin 中广泛使用另一个的约定规则(其…
Read more

Kotlin Reference: Inline Functions

  使用高阶函数会引入一定的运行时损耗:每一个函数都是一个对象,并且要获取闭包,即在函数内访问外部函数作用域的变量。(对函数对象和类的)内存分配和虚调用都会引入运行时开销。   但在很多情况下,使用内联 Lambda 表达式可以消除此种开销,下面给出的函数很好地展现了这一情况,即 lock() 函数可以很容易地在调用处内联,考虑下面的场景:   编译器不会为该参数创建一个函数对象再进行调用,而是会…
Read more

Kotlin Reference: Higher-Order Functions and Lambdas

Higher-Order Functions   高阶函数指的是以函数作为参数或返回值的函数。lock() 函数是一个很好的例子,它接受一个对象和一个函数作为参数,获取对象的锁后,执行函数并释放锁: 来看一下上面的代码:body 是函数类型() -> T,这个函数没有参数,有一个类型为 T 的返回值。它被 lock 保护,在 try 块中被调用,其结果由 lock() 函数返回。   如果要…
Read more