Kotlin 分为两类相等性:
构成相等使用 == 运算符,并调用 equals() 来确定两个实例是否相等。(比较内容是否相等,和JAVA类似)
引用相等使用 === 运算符,以检查两个引用是否指向同一对象。(比较引用的实际的对象是否相等,这个比较特殊)
数据类主构造函数中定义的属性将被用于检查构成相等性。
val user1 = User("Jane", "Doe")
val user2 = User("Jane", "Doe")
val structurallyEqual = user1 == user2 // true
val referentiallyEqual = user1 === user2 // false
将 Repository 类转换为 Kotlin 时,自动转换器已将用户列表设为可为 null,这是由于我们在声明时并未将其初始化为对象。在 users 对象的所有使用情境中,我们都使用了非 null 断言运算符 !!。该运算符可将所有变量转换为非 null 类型,并在值为 null 时抛出异常。使用 !! 时,存在运行时抛出异常的风险。
建议您使用下列其中一种方法来处理可空性:
执行 null 检查 (if (users != null) {...})
使用 Elvis 运算符 ?:(稍后将在 Codelab 中阐述)
使用某些 Kotlin 标准函数(稍后将在 Codelab 中阐述)
您可在官方文档中阅读有关空安全的更多内容。
kotlin经常有这么一种情况,它默认变量不为空,意味着变量在某一语义下始终是有意义的,但在实际应用中,有绝对不能为空的情况,但是由于构建变量的时候没有初始化附值,此时,kotlin会将其视为可为null类型,并在添加变量动作监听器时使用!!(强制标记标量为非null)断言运算符来解锁按钮。
Repository 类目前已实现如何为 User 对象计算格式化用户名。但若要在其他类中重复使用同一种格式化逻辑,我们便需复制并粘贴该逻辑,或将其移至 User 类。
Kotlin 支持在任何类、对象或接口的外部声明函数和属性。例如,用于创建新 List 实例的 mutableListOf() 函数便直接在标准库内的 Collections.kt 中定义。
在 Java 中,每当需要一些实用程序功能时,您大都会创建一个 Util 类,并将该功能声明为静态函数。而在 Kotlin 中,您可以声明顶层函数,无需使用类。不过,Kotlin 还支持创建扩展函数。这些函数可扩展特定类型,但在该类型外部声明。因此,它们与该类型具有亲和性。
当我们缺少某个类的所有权,或由于某个类不允许继承时,我们均需扩展该类的功能。为此,Kotlin 已创建名为扩展的特殊声明。Kotlin 支持扩展函数和扩展属性。
您可使用可见性修饰符来限制扩展函数及扩展属性的可见性。这些修饰符仅向需要扩展的类开放扩展功能,且不会污染命名空间。
在 Repository 类代码中,我们将多个 User 对象添加到 _users 列表中。借助作用域函数,我们将能以更为习惯的方式作出这些函数调用。
为了仅在特定对象的上下文中执行代码,而无需根据名称来访问该对象,Kotlin 专门创建了 5 个作用域函数,即:let、apply、with、run 和 also。这些函数虽简洁但功能强大,它们均具有接收器 (this),可以带有参数 (it),还有可能返回值。您可根据自己想要实现的目标,以决定使用哪个函数。
原文:https://www.cnblogs.com/saku/p/14035393.html