我是一名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类型等等。
望大神多多指点。
网友评论