关键字as/let/operator

2020-08-11  本文已影响0人  主音King

关键子as

避免命名冲突

import android.util.Log as MyLog
MyLog.d(TAG, "test: ")

let

let函数一般结构

object.let{
  it.todo // 在函数体内使用it替代object对象去访问其共有的属性和方法
  ...
}

// 判断object为null的操作
object?.let{ // object不为null条件下,才会执行let函数体
it.todo
}

let函数底层的inline扩展函数+lambda结构

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

let函数inline结构分析:一个lambda函数快block参数的函数,T类型的let函数,对象为函数参数。函数快内可以通过it指代该对象。返回值为函数块的最后一行或指定return表达式。

        fun test() {
            val result = "testLet".let {
                Log.d(TAG, "test-length ${it.length}")
                1000
            }
            Log.d(TAG, "test-result $result")
        }

let使用场景:
let函数处理null对象统一做判空处理;明确一个变量所处特定作用范围内可以使用。

运算符重载 operator

对已有的运算符赋予他们新的含义。
+ 号对应的 plus

data class Person(var name: String, var age: Int)

operator fun Int.plus(b: Person): Int {
    return this + b.age
}
//  测试:实现Int和Person相加(其实是Int对象和person的age相加)
        fun test() {
            val person1 = Person("A", 3)
            val testInt = 5
            Log.d(TAG, "${testInt + person1}")
        }

原理:运算符重载是函数重载,是对运算符函数的调用,运算符-->对应函数的映射过程由编译器完成。
给我们提供一些自定义的操作运算符。
比如我们实现:两个person向加

data class Person(var name: String, var age: Int) {
    operator fun plus(other: Person): Person {
        return Person(this.name + "+" + other.name, this.age + other.age)
    }
}

// 测试
        fun test() {
            val person1 = Person("A", 3)
            val person2 = Person("B", 4)
            var person3 = person1 + person2
            Log.d(TAG, "person3:$person3")
        }

一元运算符:

表达式 函数名
+a unaryPlus
-a unaryMinus
!a not
++a,a++ inc
--a,a-- dec

二元运算符

表达式 函数名
a+b a.plus(b)
a-b a.minus(b)
a*b a.tiems(b)
a/b a.div(b)
a%b a.rem(b)或a.mod(b)
a..b a.rangTo(b)

比较运算符

表达式 函数名
a==b a?.equals(b)?:(b===null)
a!=b !(a?.equals(b)?:(b===null))
a>b a.compareTo(b)>0
a<b a.compareTo(b)<0
a>=b a.compareTo(b)>=0
a<=b a.compareTo(b)<=0

注意:
kotlin中&&、||、?:、===、!==是不能被重载的
但是还可以重载get、set等方法

上一篇 下一篇

猜你喜欢

热点阅读