Kotlin常用运算符、分支表达式、中缀表达式以及Lamba表达式的解析

1,672 阅读2分钟

一、分支表达式

if...else分支表达式

在Java中,if...else是被称为if-else语句的,但是Kotlin中是一种表达式的体现,比如:

if(a == 1){
    b = 2
}else{
    b = 3
}

//这里可以等价写成
b = if(a==1) 2 else 3 //类似于Java中的三元表达式 a > b ? a : b

when...表达式

上述if-else表达式在刚用kotlin写Android项目时,作为一个已经熟练Java的选手可能不会使用b = if(a==1) 2 else 3这种形式,但是when表达式是基本会用到,因为when表达式对标的是Java中的switch语句,比如监听多个button的写法:

when(view?.id){
    R.id.btn1 -> {}
    R.id.btn2 -> {}
    R.id.btn3 -> {}
    R.id.btn4 -> {}
    else -> {} //默认处理,看实际情况需要添加
}

try...catch表达式

Kotlin中try-catch也是一种表达式,如:

try {
    c = a - b
}catch (e:Exception){
    e.printStackTrace()
    c = 0
}

//因为try和catch是各一个分支 所以写成如下表达式
c = try {
   a - b
}catch (e:Exception){
   e.printStackTrace()
   0
}

二、常见运算符

== 与equals

"Kotlin" == "Kotlin" 等价于 "Kotlin".equals("Kotlin")

+ 与plus

1+1 等价于 1.plus(1)

in 与contains

val list = listOf(1,2,3)
if((2 in list) && list.contains(2)){
    println("in和contains运算符是等价的")
}

[]与get

val map = mapOf(
    "Hello" to 1,
    "Kotlin" to 2
)

val value = map["Hello"]

val value2 = map.get("Hello")

println(value == value2)

三、中缀表达式

A to B 就是中缀表达式的形式,其等价于A.to(B),其定义的模型是:

infix fun<A,B> A.to(that:B): Pair<A,B> = Pair(this,that)

infix是中缀表达式的关键字,A.to(that:B)的形式就是有receiver为A,并且参数只有一个B,这样函数就可以表现成A to B,当函数表现为一个表达式时可直接写作简写的形式:Pair(this,that).下面简单用一个扩展方法说明中缀表达式的使用

infix fun String.rotate(count:Int):String{
    val index = count % length
    return this.substring(index) + this.substring(0,index)
}

println("KotlinStudy" rotate 6) // 得到StudyKotlin

四、Lamba表达式

Kotlin的匿名函数

//没有名字的函数
fun(){ 
    println("Kotlin Study")
}

匿名函数的传递

//func就是变量名 函数的变量
val func = fun(){
    println("Kotlin Study")
}

//调用 
func()

倒推一下上述匿名函数的类型:接受零个参数,返回Unit类型

val func:() -> Unit = fun(){
    println("Kotlin Study")
}

Kotlin中的Lamba表达式实际是匿名函数的更具语法糖表现形式的一种写法

val mLamba = {
    println("Kotlin Study")
}

//上述可以等价写成下面 
val mLamba:() -> Unit = {
    println("Kotlin Study")
}
//从{}里面看没有参数可以推出是无参函数,println()也是无返回值,所以函数类型是Unit

下面有参数函数的Lamba表达式

    val func:Function<Int,Unit> = {p -> println(p)}
    //亦等价表现以下形式
    val func:(Int) -> Unit = {p:Int -> 
        println(p)
    }

Lamba表达式的参数省略形式

val func:Function<Int,Unit> = {
    println(it) //只有一个参数,参数名可默认为it
}

有返回值的匿名函数Lamba表达式

val func = {p:Int ->
    "Kotlin"
}
//这里可以看出 func代表的是一个匿名函数的传递,参数是int类型,返回值类型是String
val str = func(1) // str返回Kotlin