0%

Kotlin扩展方法

Kotlin与Java相比有一个很高级的特性,就可以扩展方法。可以直接为一个类的所有对象添加方法。
比如以下代码可以为所有String类型对象添加一个printIt()方法,调用时打印其本身。

1
2
3
fun String.printIt() {
println(this)
}

以上代码可以简写为

1
fun String.printIt() = println(this)

使用方式如下

1
2
3
fun main(args: Array<String>) {
"Hello world!".printIt()
}

输出:Hello world!
在扩展方法里面this为调用者本身。

Kotlin的扩展方法在扩展一些第三方包和Java本身包里面的类方法时很有用。比如在JDK 1.8中新加入了LocalDateLocalDatetime类型,方便了日期的处理,但使用时经常会遇到Date类型与这两种类型的转换。这时就可以定义几个扩展方法,方便使用。代码如下

1
2
3
4
5
6
7
fun LocalDate.toDate(zoneId: ZoneId = ZoneId.systemDefault()) = Date.from(atStartOfDay(zoneId).toInstant())

fun LocalDateTime.toDate(zoneId: ZoneId = ZoneId.systemDefault()) = Date.from(atZone(zoneId).toInstant())

fun Date.toLocalDate(zoneId: ZoneId = ZoneId.systemDefault()) = toInstant().atZone(zoneId).toLocalDate()

fun Date.toLocalDateTime(zoneId: ZoneId = ZoneId.systemDefault()) = toInstant().atZone(zoneId).toLocalDateTime()

以上方法中还使用到了Kotlin默认参数特性。
使用时很简单,代码如下:

1
2
3
4
5
6
7
8
9
10
11
fun main(args: Array<String>) {
val date = Date()
println(date.toLocalDate())
println(date.toLocalDateTime())

val localDate = LocalDate.now()
println(localDate.toDate())

val localDateTime = LocalDateTime.now()
println(localDateTime.toDate())
}

输出:

1
2
3
4
2018-07-29
2018-07-29T20:50:19.957
Sun Jul 29 00:00:00 CST 2018
Sun Jul 29 20:50:20 CST 2018