Android开发

Kotlin中的表达式、语句以及猫王

本文主要是介绍Kotlin中的表达式、语句以及猫王,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.前言

Kotlin在Android开发领域已经有很长一段时间了,从去年开始也致力于在团队中推广Kotlin在项目中进行产品开发,相比于Java,我们更关注的就是Kotlin编译移动端代码的快速(大量的语法糖)、空安全、与Java的高度融合以及google的大力扶持(现在官网上的代码几乎都是Kotlin来写的)。虽然Kotlin与Java同为jvm语言,而且语法很像,学习成本较低,但是有些点还是需要注意下的,今天这篇文章就是前段时间在业务中遇到的一些小的语法问题进行一下总结

2.表达式与语句

什么是表达式,什么是语句,这两个概念似乎大家平时很少注意,也似乎没见过什么很官方的解释,这里说一下自己的理解。

表达式:表达式一般由变量或者数值以及运算符组合而成,拥有返回值。

语句:语句可以理解为一种行为,一般包含表达式,可以执行,例如for语句,if语句,赋值语句等。 举例:

if(a>b){
    test()
}

fun test(){
   println("test") 
}

复制代码

这其中a>b就是表达式,而if就是语句,这里test函数的调用test()其实也可以理解为一个表达式,它也有返回值,在kotlin中返回unit。

3.Void与Unit

在Java中,定义一个函数没有返回值时我们会声明这个函数的返回类型为Void

public void test(){
    return;//return也可以不写
}
复制代码

而在Kotlin中,我们定义一个函数没有返回值得时候不需要什么特殊声明

public fun test(){
    return //return也可以不写
}
复制代码

但是实际上这个函数也可以这样定义

public fun test():Unit{
    return Unit
}
复制代码

这两种定义方式其实是相同的,但是你可以看到,在Kotlin中Unit就是和Java中的void相对应的。再来看一下Unit的定义

public object Unit {
    override fun toString() = "kotlin.Unit"
}

复制代码

这是一个单例类。

这里有一个很重要的点,那就是Unit不等于null,有些人会误解Unit与null是相同的,实际上这其实是两个不同的概念,Unit是一个单例对象,占用内存的;而null则是并没有在内存中定义,占用内存的

4.猫王运算符(Elvis)

猫王运算符?:,这个算是Kotlin提供的一个重要语法糖了,还有一个和它很像的就是?.当然,含义是不一样的,?.是用来判断一个对象是否为null的,如果对象为null,就返回null,否则就执行?.的后面的对象的方法。 下面摘抄一段Kotlin官网中对?:的解释:

如果 ?: 左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。 请注意,因为 throw 和 return 在 Kotlin 中都是表达式,所以它们也可以用在 elvis 操作符右侧。

看这个定义,这里说的表达式为空是什么意思,函数返回Unit是函数返回为空吗?很明显,前面咱们说了,函数返回为Unit与函数返回null是两个意思。有的时候,?.和?:联合使用时,会让人觉得有些疑惑,举个例子:

fun main() {
    getString()?.let {
        test(it)
    } ?: println("not print test")
}

fun getString():String?{
    return "9"
}

fun test(content:String){
    println("test $content")
}

//代码结果:
test 9

fun main() {
    getString()?.let {
        test(it)
    } ?: println("not print test")
}

fun getString():String?{
    return null
}

fun test(content:String){
    println("test $content")
}

//代码结果:
not print test
复制代码

上面的代码,当getString放回"9"和返回null时,出现了不同的结果。当返回"9"时,因为,9不为空,执行"9"这个字符串的let方法,这个let方法是一个泛型扩展方法,有一个泛型返回值,同时根据lambda表达式的定义,最后一行的调用的表达式的值就是返回值,因为test没有返回值,所以最后的返回值是Unit,前面说了Unit不是null,所以不会打印not print test。再来看当getString返回null时,这个时候因为getString返回为null,所以压根就不会执行let方法,表达式的值为null,根据Elvis运算符的定义,如果?:前面的表达式为null,那么就会执行后面的表达式,所以自然就会打印not print test。

有的人会问为什么?:叫做猫王运算符,一是?:Kotlin的官方叫法是Elvis,和猫王的本命Elvis Presley名相同,第二点我估计是发型很像。

很早以前听过一段时间猫王,但是真正留下印象的好像也只有那首《hey jude》。还是喜欢朴树,有那个纯真时代一个诗人的矫情和潇洒。

关注我的公众号

这篇关于Kotlin中的表达式、语句以及猫王的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!