如果你使用Kotlin写的越多,你就会越喜欢它(我怕是已经中毒啦)。Kotlin的第一周,我们就打下基础吧。
第一天:Elvis 操作符
想优雅地处理null?不妨看一下?:这个操作符呗。它只是一个可以将空值替换为一个默认值甚至是return 语句的语法糖!文档:Elvis operator
val name: String = person.name ?: “unknown”
val age = person.age ?: return
第二天:字符串模板
想格式化字符串?在字符串字面量中将$置于变量名的前面可以引用到变量和表达式。计算表达式时使用${expression}.文档:string templates
val language = “Kotlin”
// “Kotlin has 6 characters”
val text = “$language has ${language.length} characters”
第三天: 解构声明
玩一下棱镜?(歪果仁是很皮)Android KTX 使用解构来给颜色的三原色赋值。你可以在类中使用析构,或者继承一个现有类后添加解构(这个特性真的很赞啊)。文档:destructuring declarations
// now with prisms
val (red, green, blue) = color
// destructuring for squares
val (left, top, right, bottom) = rect
// or more pointedly
val (x, y) = point
第四天:when 表达式
一个具有超能力的switch语句?Kotlin的when表达式可以匹配 任何东西。字面量,枚举,数字区间等等。你甚至可以调用任何函数!文档:when
class Train(val cargo: Number?) {
override fun toString(): String {
return when (cargo) {
null, 0 -> "empty"
1 -> "tiny"
in 2..10 -> "small"
is Int -> "big inty"
else -> "$cargo"
}
}
}
第五天:For循环,区间表达式和解构
For循环和kotlin的另外两个特性-区间表达式和解构一起使用时将获得超能力。文档:ranges,destructuring
// iterating in the range 1 to 100
for(i in 1..100) {…}
// iterating backwards, in the range 100 to 1
for(i in 100 downTo 1){…}
// iterating over an array, getting every other element
val array = arrayOf(“a”, “b”, “x”)
for(i in 1 until array.size step 2 ){…}
// iterating over an array with the item index and destructuring
for((index, element) in array.withIndex()) {…}
// iterating over a map
val map = mapOf(1 to “one”, 2 to “two”)
for( (key, value) in map){…}
第六天:属性
kotin中,类可以有可变和只读的属性,getters和setters默认会生成。如果有需要你也可以实现自定义的属性。文档:
class User {
// properties
val id: String = “” // immutable. just getter
var name: String = “” // default getter and setter
var surname: String = “” // custom getter, default setter
get() = surname.toUpperCase() // custom getter declaration
var email: String = “” // default getter, custom setter
set(value) { // custom setter declaration
// “value” = name of the setter parameter
// “field” = property’s backing field; generated
if(isEmailValid(value)) field = value
}
}
第七天: 数据类和相等性
创建一个只扮演一种角色的类: 仅用于装载
数据?将类标注为“data”类即可,equals()方法的默认实现会自动生成,hasCode(),toString(),和copy()方法当然也是如此啦,而且会检验结构相等性。文档:data classes,equality
data class User(
val name: String,
val email: String,
val address: Address,
…
)
public class UserListDiffCallback: DiffUtil.Callback() {
override fun areContentsTheSame(
oldItemPosition: Int,
newItemPosition: Int
): Boolean {
// use the generated equals method
return newUserList[newItemPosition] ==
oldUserList[oldItemPosition])
}
本周注重基础:消除空值错误,简化循环和条件表达式,优化getters和setters,并去消除样板代码。下周我们将探索Kotlin更多的特性。