关键子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等方法
网友评论