Kotlin学习之旅第六天
今天的主题是:Kotlin中的习惯用法-第一部分
前言
习惯用法
-
创建DTOs
-
函数的默认参数
-
过滤list
-
String字符串模板
-
类型判断
-
遍历Map
-
扩展函数
-
创建单例
—————————————————— Part 1
-
使用表达式
-
静态方法
-
使用命名参数替代setter
-
使用apply()
-
处理可空对象
-
使用as替代is
-
快速创建JSON
创建DTOs
在Android中,我们经常需要创建Bean,也就是包括了setter,getter,toString等常见代码的一种类,一般用于接收后台返回的JSON格式的数据,在Kotlin里面,我们可以用很简单的语法完成Bean类的编写:
data class Customer(val name: String, val email: String)
我们定义了一个Customer类,构造方法传入两个参数name, email,这个类包括以下方法:
- 所有属性的 getters (对于 var 定义的还有 setters)
equals()
hashCode()
toString()
copy()
在Kotlin中,这种类也叫做数据类,data class,一个关键字即可完成之前在Java里面需要写的大量模板代码,是不是很方便呢?
函数的默认参数
这个之前在讲函数的时候也提到过,可以减少重载方法的数量
fun foo(a: Int = 0, b: String = ""){...}
这里定义了一个foo函数,传入a,b两个参数,其中a的默认值为0,b的默认值为空字符串
那么在调用foo的时候,我们可以直接写
foo()
不传a,b的话,就使用默认值进行运算。
过滤list
val positives = list.filter { x -> x > 0 }
或者可以更短:
val positives = list.filter { it > 0 }
String字符串模板
这个之前也提到过,就是在字符串里面,加入其它的字符串变量,在Java中,需要通过format函数来进行赋值,在kotlin中也是变得更加简洁:
println("Name $name")
$ 加上 变量名 就可以实现在String中插入变量的功能
类型判断
这个特性是经常会用到的,例如在解析JSONObject,或者是需要把JSON转成需要的数据类型时,以前的写法
if(json.getXXX != null){
if (json.getXXX instanceOf Foo){
....
} else if (json.getXXX instanceOf Bar){
...
} else {
...
}
}
在Kotlin中,通过when + is 来实现
when (x) {
is Foo //-> ……
is Bar //-> ……
else //-> ……
}
是不是一目了然,妈妈再也不用担心我看代码看到心烦意乱了?
遍历map/pair类型的list
for ((k, v) in map) {
println("$k -> $v")
}
如果是在Java里面,我们需要通过key来找value,然后再输出,代码量又是蹭蹭的往上串
扩展函数
emmm,这个之前在函数那一篇文章里面已经讲得比较清楚了,忘了的童鞋可以重温一下:Kotlin学习之旅(D4)-函数与Lambda表达式
直接上代码:
fun String.spaceToCamelCase() { …… }
"Convert this to camelcase".spaceToCamelCase()
String里面是没有spaceToCamelCase这个方法的,但是我们又不想通过继承让所有子类都加上这个方法,那么可以通过扩展函数来实现。
创建单例
单例模式我们经常都会用到,在Java里面的写法也是多种多样,但是所有形式的代码量都没有Kotlin里面来的简洁:
object Resource {
val name = "Name"
}
没错,就是通过object关键字定义单例。
总结
这些习惯用法都是前人通过大量实践总结出来的,可以提高我们的开发效率,所以我们也应该多学习这些用法,努力让自己写出来的代码简洁易懂。
Day 6 - Learn Kotlin Trip, Completed.