Kotlin学习(6)扩展函数与属性

在Java中,我们经常使用到诸如StringUtil、DateUtil等工具类,代码写起来比较冗长。
比如我们要写一个工具类,获取一个字符串的第一个字母和最后一个字母,我们要先写一个工具类,然后定义好这两个方法。因为String类是不能自己添加自定义方法的。

在Kotlin就不一样了,天然的装饰模式,使得代码更加简洁明了。

1. 扩展函数

1.1 给String类扩展两个函数

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

  fun String.lastChar(): String {
        if (this.isEmpty()) return ""
        return this[this.length - 1].toString()
    }
    
//调用:
println("abc".firstChar())   //a
println("abc".lastChar())    //c

//如果在其它package路径下面,则需要调用import导入扩展函数
import com.rikka.kotlin.firstChar
import com.rikka.kotlin.lastChar

1.2 给List扩展一个过滤函数
如果我们在koltin中自定义一个过滤函数,应该是这样写的:

 fun <T> List<T>.filter(predicate: (T) -> Boolean): MutableList<T> {
        val result = ArrayList<T>()
        this.forEach {
            if (predicate(it)) {
                result.add(it)
            }
        }
        return result
    }
//调用
val result = list.filter{
     it % 2 == 1
}
println(result)

使用 fun <类型参数> 目标类型.扩展函数名(函数入参): 函数返回类型 来扩展

2. 扩展属性

除了扩展一个类的函数,还可以扩展类属性。
例如,我们给MutableList扩展两个属性: firstElement和lastElement,代码如下:

 private var <T> MutableList<T>.firstElement: T
        get() {
            return this[0]
        }
        set(value) {
            this[0] = value
        }
    var <T> MutableList<T>.lastElement: T
        get() {
            return this[this.size - 1]
        }
        set(vale) {
            this[this.size - 1] = vale
        }

//使用:
println(list.firstElement)
println(list.lastElement)
list.firstElement = x
list.lastElement = y

语法说明如下:

var <类型参数> 目标类型.扩展函数名:扩展函数的类型
  get(){
      //getter
  }
  set()}{
      //setter
  }

3. 扩展中的关键字

在前面的List扩展函数filter()的实现中,用到了一个this关键字

this.forEach{
   if(predicate(it)){
      result.add(it)
   }
}

这里的this指的是接收者对象,也就是调用扩展函数时,在点号"."之前指定的对象实例。
为了表示当前函数的接受者,Kotlin中使用this表达式:

  • 在类的成员函数中,this指向这个类的当前对象实例
  • 在扩展函数中,this代表调用函数时在点号左侧传递的接受者参数
  • 如果this没有限定符,那么它指向包含当前代码的最内层范围。
发布了248 篇原创文章 · 获赞 99 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/rikkatheworld/article/details/102920559