坐谈kotlin与java

我是一名Android工程师,之前一直使用java语言进行开发,最近正在学习kotlin语言,想把kotlin语言的一些学习心得记录下来,接下来是本人的一些心得。

首先,What is kotlin?
kotlin是2011年推出的一款面向对象的一门新的开发语言,而现在AndroidStudio也完全支持kotlin的使用,本文将通过与java之间的对比对kotlin进行一个介绍。

kotlin与java的区别?
首先java与kotlin的语法有很大的不同又有很大的相同。kotlin文件的后缀名是.kt,而java的后缀名是.java。在java当中创建对象需要使用new关键字,但是在kotlin中并不需要使用new,也没有new关键字。如:

//kotlin示例
val person = Person() //kotlin的结尾省去了java比较繁琐的;分号结尾

//java示例
Person person = new Person(); //结尾必须加上分号

从以上示例当中我们可以看到,kotlin的写法相对于java来说比较精简,并且省去了java中的结尾分号;在kotlin中定义变量需要使用val,var关键字进行变量的声明,而在java中不需要。

除了上面的区别以外,在kotlin中添加很多新的关键字,并且省去了java中的一些关键字,如:when表达式。

//kotlin

when(a){
    1->{/*代码块*/}
    2->{/*代码块*/}
    3..4->{/*支持区间的使用,比较方便判断*/}
    else -> /*kotlin中默认执行代码块*/
}

//java
switch(a){
    case 1:/*代码块*/break;
    case 2:/*代码块*/break;
    case 3:
    case 4:/*这样case3也会执行到这里,与kotlin中的区间表示一个意思*/break;
    default :/*默认Switch表达式的处理方法*/
}

上面所描述的when表达式和switch表达式的意思是一样的,都是代码分支语句。当然除了可以作为分支使用,when表达式还可以有返回值,如:

var person = when(age){
    20 -> Person("张三")
    21 -> Person("李四")
    else -> Person("王五") //when表达式有返回值时,必须有else分支,否则会报错
}

//这样上面的when表达式执行后的结构会根据不同分支的条件,将不同的对象赋值给person变量

除了以上的一些语法上的不同以外,kotlin还对java的线程进行封装:携程。携程是对线程池的管理和使用,相对于java来说,对于线程的控制更加简单便捷,但是使用的时候需要添加库,如:

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"

//使用案例  Dispatchers.Main因为这个的原因,此代码块为主线程
GlobalScope.launch(Dispatchers.Main){
    //这里是主线程
    getData()//这里因为此函数有suspend的修饰,将函数改为挂起函数
    //这里还是主线程
}
suspend fun getData(){
//获取网络数据  此时 此方法为子线程
}

携程不止这点用法,还有很多,忧郁本文只是介绍一下,就不多说什么了。
对于kotlin与java最大的不同还有kotlin省去了java的get和set方法,或者说,kotlin默认给属性加上了get和set方法了。

class Person{
    var name:String? = null
    var age:Int? = null
}
//使用
val person = Person()
Log.v("person>>name",person!!.name)

这段代码中的person!!.name其实换做java的写法就是person.getName()。

!!与?和?:的用法
为什么着重说一下这三个的用法,因为这三个符号很大程度的减少了kotlin中的空指针异常。
!!这个代表调用时对象必须不为空,如果是空那么久直接抛出异常。
?这代表调用时,对象如果是空,那么本语句不执行

?:使用时,可以设置当对象为空时的默认值,如:name?:"你好Toast".showToast(),这种情况,当name为空的时候就会执行你好Toast的语句,有点类似于java的三目运算符,不过,判断条件只是空判。

以上就是java与kotlin的少量区别,当然还有好多区别,这里就不一一介绍了。

kotlin的优点与劣势
在使用kotlin的过程中,让我最佩服的就是扩展函数。
扩展函数:扩展函数就是不存的继承的情况下,仍然可以给指定类型添加功能模块。

//定义String的扩展函数
fun String.showToast(){
    ToastUtils.showShort(this) //这里的this指向调用者String这个对象
}
//使用扩展函数
"你好,我是Toast".showToast() //这里可以直接对字符串对象进行toast

神奇吧,这个功能用好了相当厉害。除了扩展函数以外,还有函数类型。
函数类型Function
:kotlin中是支持将函数作为参数进行使用,当然也可以创建函数类型的变量。

var show:( (msg) -> Unit )? = null //这里定义一个变量为函数类型,(参数列表) -> 返回值类型
//调用函数
show("你好")//这里就会直接调用show变量指向的函数

//也可以将函数类型放到参数列表里面来使用
fun setListener(listener : (view) -> Unit ){
    //这里是一种监听...
    listener.invoke(view)//这样调用listener函数
}
//调用setListener方法
setListener{ view ->
    //这里就是上面的listener函数的函数体
}

还有object对象,object对象定义的内容全都可以静态访问的,定义方法简单,一般常用与工具类的编写,object对象的定义也是相当简单,和类的定义方法一样,将class关键字换成object关键字即可。

object ToastUtils{
    private lateinit var context:Context //这里为静态访问变量
    //这里的方法initUtils函数也是静态访问的函数
    fun initUtils(context:Context){
        this.context = context
    }
}
//调用案例
ToastUtils.initUtils(context)

所以kotlin是支持直接定义静态访问类型的,相对java来说,这一点也是方便了很多。

好了今天就聊到这里,领导来了……

总结:kotlin语言优化了java的空指针,有效的减少了空指针异常,并且简化了大部分java代码。kotlin还有很多吸引人的语法:when表达式的返回值,if表达式的返回值,!!  ?   ?:的使用,扩展函数,Funcation类型等等。

望大神多多指点。

你可能感兴趣的:(坐谈kotlin与java)