Kotlin新手入坑:扩展函数和运算符重载._...ST

抓住今天,尽可能少的信赖明天。 喝汤能补 (* ^ ▽ ^ *)

前言

  该文章作为学习交流,如有错误欢迎各位大佬指正 (* ^ ▽ ^ *)

  • 自身技能
    (1)已具备计算机的基本知识
  • 本文简介
    主要讲解:扩展函数的含义和用法;对所有的运算符进行重载的函数。

扩展函数

  扩展函数,表示即使不在修改某个类的源码的情况下,仍然可以打开这个类,向该类添加新的函数,所以该函数拥有该类的实例上下文。

  • 相比于普通函数,只需在函数名的前面加上一个ClassName.的语法,就表示将该函数添加到指定类当中了。(ClassName. 就是 类名.)
  • 扩展函数可以定义在现有类,或者是新的文件中,通常将它定义成顶层方法(.kt文件中)。
  • 文件名没有固定的要求。 一般,我们向哪个类中添加扩展函数,文件名就与那个类名同名,方便以后我们便于查找。
// 语法如下
fun ClassName.methodName(param1: Int,param2: Int): Int{
    return 0
}

  简单的使用例子,统计一个含有数字,字母,符号的字符串中,字母的个数。
  在使用扩展函数时,因为wordsCount已经定义成String类的扩展函数了,那么该函数就自动拥有String实例的上下文。故不需要接收字符串参数了,直接使用this遍历即可,this代表着字符串本身。
通常的代码,与使用扩展函数进行简化的代码。

object StringUtil {
    fun wordsCount(str: String): Int {
        var count = 0;
        for (char in str) {
            if (char.isLetter()) {
                count++
            }
        }
        return count
    }
}

fun main() {
    val str = "123q.vaft/.']"
    println(StringUtil.wordsCount(str))
    // 结果 5
}
fun String.wordsCount(): Int {
    var count = 0;
    for (char in this) {
        if (char.isLetter()) {
            count++
        }
    }
    return count
}

fun main() {
    println("123q.vaft/.']".wordsCount())
}

运算符与运算符重载

  Kotlin允许我们对所有的运算符(+ - * / % ++ --),以及其他关键字进行重载,从而拓展这些运算符与关键字的用法。

  • 语法:运算符重载使用的是operator关键字,在指定函数的前面加上operator关键字,就可以实现运算符重载了。
  • 指定函数,不同的运算符对应的重载函数是不同的,比如:+ 对应plus()  - 对应minus()
  • 可以在类中,对同一运算符进行多次重载,来满足不同的需求。

常用运算符与其对应的指定函数

语法表达式实际调用函
a + ba.plus(b)
a - ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.rem(b)
a++a.inc()
a–a.dec()
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a == ba.equals(b)
a…ba.rangeTo(b)
a[b]a.get(b)
a[b] = ca.set(b,c)
a in bb.contains(a)
contains表示b是否包含a   a in b表示a是否在b中。
a in b的简单例子: “hello”.contains(“he”) 与 “he” in “hello” 效果一样。
a > ba.compareTo(b)
a < b
a >= b
a <= b

  以加号为例子. operator 与 plus是固定不变的,参数和函数返回值可以自行定义。代码表示的含义,一个Obj对象 加上 另一个Obj对象,返回一个新的Obj对象。代码上可以直接使用 + 进行调用,编译的时候会被转换成obj1.plus(obj2)的调用方式。

// 简单语法示例
class Obj {
    operator fun plus(obj: Obj): Obj {
        // 处理相加的逻辑
    }
}

// 调用方式。
val obj1 = Obj()
val obj2 = Obj()
val obj3 = obj1 + obj2
class Money(val value: Int) {
    operator fun plus(money: Money): Money{
        val sum = value + money.value
        return Money(sum)
    }
    
    operator fun plus(new : Int): Money{
        val sum = value + new
        return Money(sum)
    }
    
}


fun main() {
    val money0 = Money(1)
    val money1 = Money(2)
    val money2 = money0 + money1
    println(money2.value)
    // 结果 3
    val money3 = money2 + 7
    println(money3.value)
    // 结果 10
}

运算符is , !is , as , as?

  使用 is 运算符用来在运行时检测对象是否是特定类的一个实例,!is 表示与is相反的判断。当判断为具体的类后,Kotlin会对类型进行智能转换,无需强转就可以使用具体类的特有方法。


test15("字符串长度")

fun test(obj: Any) {
    // obj.length 报错
    if (obj is String) {
        println(" 字符串长度 "+obj.length)
    } else{
        println(" 不是String类型")
    }
    
    when (obj) {
        is Int -> print(obj + 10)
        is String -> print(obj.length)
        is IntArray -> print(obj.sum())
    }
    
}

  通过 as 和 as?运算符强制类型转换,然后调用对应类的对应方法。

fun test() {
    val s = "5"
    val str = s as String
    println(str.length)


    val sss = 5
//    val sssR = sss String  运行出现异常报错
    val sssR = sss as? String
    println(sssR?.length)

}

(* ^ ▽ ^ *)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值