Kotlin扩展属性和扩展函数

  • 在使用java的时候,我们经常使用StringUtils,DateUtils等工具类,代码写起来比较冗长,调用方式也是 StringUtils.方法名的方式,以String为例,如果能直接 “abc”.自定义方法,的方式来调用会不会更方便。
  • Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。

扩展函数

  • 给String扩展两个函数
    例如,给String扩展firstChar和lastChar函数,代码如下
package com.demo.kotlin

fun String.firstChar(): String {
    if (this.length == 0) {
        return ""
    }
    return this[0].toString()
}

fun String.lastChar(): String {
    if (this.length == 0) {
        return ""
    }
    return this[this.length - 1].toString()
}

然后在可以直接调用

package com.demo.kotlin


object Text {

    @JvmStatic
    fun main(args: Array) {
        println("abc".firstChar())
        println("qwe".lastChar())
    }
}

输出结果如下

a
e

如果不在同一个包名下,导入一下引用就可以了,系统会提示自动导入的

package com.demo.kotlin.t

import com.demo.kotlin.firstChar
import com.demo.kotlin.lastChar

object Test1 {
    @JvmStatic
    fun main(args: Array) {
        "test".firstChar()
        "test".lastChar()
    }
}

扩展函数语法就是
Kotlin扩展属性和扩展函数_第1张图片

  • 给List扩展一个函数
fun  List.filter(predicate: (T) -> Boolean): MutableList {
    val result = ArrayList()
    this.forEach {//this指的是调用者对象
        if (predicate(it)) {//如果满足循环条件
            result.add(it)
        }
    }
    return result
}

调用如下

object Text {

    @JvmStatic
    fun main(args: Array) {
        val list = mutableListOf(1, 2, 3, 4, 5, 6, 7)
        val filter = list.filter { it % 2 == 0 }
        println(filter)
    }
}

输出如下

[2, 4, 6]

Kotlin扩展属性和扩展函数_第2张图片

扩展属性

为MutableList扩展一个firstElement属性

var  MutableList.firstElement: T
    get() { //扩展属性的get函数
        return this[0]
    }
    set(value) { //扩展属性的set函数
        this[0] = value
    }

调用如下

object Text {
    @JvmStatic
    fun main(args: Array) {
        val list = mutableListOf(1, 2, 3, 4, 5, 6, 7)
        println(list.firstElement)
        list.firstElement = 100
        println(list)
    }
}

输出如下

1
[100, 2, 3, 4, 5, 6, 7]

Kotlin扩展属性和扩展函数_第3张图片

扩展函数的实现原理

扩展属性和扩展函数的本质是以静态导入的方式来实现的。
下面是String.firstChar反编译的java代码

@NotNull
   public static final String firstChar(@NotNull String $receiver) {
      Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
      return $receiver.length() == 0 ? "" : String.valueOf($receiver.charAt(0));
   }

你可能感兴趣的:(Kotlin)