Kotlin学习之旅(D6)-Kotlin Idioms part 1

Kotlin学习之旅第六天

今天的主题是:Kotlin中的习惯用法-第一部分

前言

Kotlin学习之旅(D1)-学习计划&基本语法

Kotlin学习之旅(D2)-基本语法

Kotlin学习之旅(D3)-类与继承

Kotlin学习之旅(D4)-函数与Lambda表达式

Kotlin学习之旅(D5)-高级语法

习惯用法

  • 创建DTOs

  • 函数的默认参数

  • 过滤list

  • String字符串模板

  • 类型判断

  • 遍历Map

  • 扩展函数

  • 创建单例

    —————————————————— Part 1

  • 使用表达式

  • 静态方法

  • 使用命名参数替代setter

  • 使用apply()

  • 处理可空对象

  • 使用as替代is

  • 快速创建JSON

创建DTOs

在Android中,我们经常需要创建Bean,也就是包括了setter,getter,toString等常见代码的一种类,一般用于接收后台返回的JSON格式的数据,在Kotlin里面,我们可以用很简单的语法完成Bean类的编写:

1
data class Customer(val name: String, val email: String)

我们定义了一个Customer类,构造方法传入两个参数name, email,这个类包括以下方法:

  • 所有属性的 getters (对于 var 定义的还有 setters)
  • equals()
  • hashCode()
  • toString()
  • copy()

在Kotlin中,这种类也叫做数据类,data class,一个关键字即可完成之前在Java里面需要写的大量模板代码,是不是很方便呢?

函数的默认参数

这个之前在讲函数的时候也提到过,可以减少重载方法的数量

1
fun foo(a: Int = 0, b: String = ""){...}

这里定义了一个foo函数,传入a,b两个参数,其中a的默认值为0,b的默认值为空字符串

那么在调用foo的时候,我们可以直接写

1
foo()

不传a,b的话,就使用默认值进行运算。

过滤list

1
val positives = list.filter { x -> x > 0 }

或者可以更短:

1
val positives = list.filter { it > 0 }

String字符串模板

这个之前也提到过,就是在字符串里面,加入其它的字符串变量,在Java中,需要通过format函数来进行赋值,在kotlin中也是变得更加简洁:

1
println("Name $name")

$ 加上 变量名 就可以实现在String中插入变量的功能

类型判断

这个特性是经常会用到的,例如在解析JSONObject,或者是需要把JSON转成需要的数据类型时,以前的写法

1
2
3
4
5
6
7
8
9
if(json.getXXX != null){
if (json.getXXX instanceOf Foo){
....
} else if (json.getXXX instanceOf Bar){
...
} else {
...
}
}

在Kotlin中,通过when + is 来实现

1
2
3
4
5
when (x) {
is Foo //-> ……
is Bar //-> ……
else //-> ……
}

是不是一目了然,妈妈再也不用担心我看代码看到心烦意乱了?

遍历map/pair类型的list

1
2
3
for ((k, v) in map) {
println("$k -> $v")
}

如果是在Java里面,我们需要通过key来找value,然后再输出,代码量又是蹭蹭的往上串

扩展函数

emmm,这个之前在函数那一篇文章里面已经讲得比较清楚了,忘了的童鞋可以重温一下:Kotlin学习之旅(D4)-函数与Lambda表达式

直接上代码:

1
2
3
fun String.spaceToCamelCase() { …… }

"Convert this to camelcase".spaceToCamelCase()

String里面是没有spaceToCamelCase这个方法的,但是我们又不想通过继承让所有子类都加上这个方法,那么可以通过扩展函数来实现。

创建单例

单例模式我们经常都会用到,在Java里面的写法也是多种多样,但是所有形式的代码量都没有Kotlin里面来的简洁:

1
2
3
object Resource {
val name = "Name"
}

没错,就是通过object关键字定义单例。

总结

这些习惯用法都是前人通过大量实践总结出来的,可以提高我们的开发效率,所以我们也应该多学习这些用法,努力让自己写出来的代码简洁易懂。

Day 6 - Learn Kotlin Trip, Completed.


本文结束啦感谢您的阅读