我是一名Android工程師恬惯,之前一直使用java語(yǔ)言進(jìn)行開發(fā)誉尖,最近正在學(xué)習(xí)kotlin語(yǔ)言狭郑,想把kotlin語(yǔ)言的一些學(xué)習(xí)心得記錄下來(lái)腹暖,接下來(lái)是本人的一些心得。
首先翰萨,What is kotlin脏答?
kotlin是2011年推出的一款面向?qū)ο蟮囊婚T新的開發(fā)語(yǔ)言,而現(xiàn)在AndroidStudio也完全支持kotlin的使用,本文將通過(guò)與java之間的對(duì)比對(duì)kotlin進(jìn)行一個(gè)介紹殖告。
kotlin與java的區(qū)別糙麦?
首先java與kotlin的語(yǔ)法有很大的不同又有很大的相同。kotlin文件的后綴名是.kt丛肮,而java的后綴名是.java赡磅。在java當(dāng)中創(chuàng)建對(duì)象需要使用new關(guān)鍵字,但是在kotlin中并不需要使用new宝与,也沒有new關(guān)鍵字焚廊。如:
//kotlin示例
val person = Person()?//kotlin的結(jié)尾省去了java比較繁瑣的;分號(hào)結(jié)尾//java示例
Person person = new Person();?//結(jié)尾必須加上分號(hào)
從以上示例當(dāng)中我們可以看到,kotlin的寫法相對(duì)于java來(lái)說(shuō)比較精簡(jiǎn)习劫,并且省去了java中的結(jié)尾分號(hào);在kotlin中定義變量需要使用val咆瘟,var關(guān)鍵字進(jìn)行變量的聲明,而在java中不需要诽里。
除了上面的區(qū)別以外袒餐,在kotlin中添加很多新的關(guān)鍵字,并且省去了java中的一些關(guān)鍵字谤狡,如:when表達(dá)式培遵。
//kotlin
when(a){
? ? 1->{/*代碼塊*/}
? ? 2->{/*代碼塊*/}
? ? 3..4->{/*支持區(qū)間的使用掉伏,比較方便判斷*/}
? ? else -> /*kotlin中默認(rèn)執(zhí)行代碼塊*/
}//java
switch(a){
? ? case 1:/*代碼塊*/break;
? ? case 2:/*代碼塊*/break;
? ? case 3:
? ? case 4:/*這樣case3也會(huì)執(zhí)行到這里,與kotlin中的區(qū)間表示一個(gè)意思*/break;
? ? default :/*默認(rèn)Switch表達(dá)式的處理方法*/
}
上面所描述的when表達(dá)式和switch表達(dá)式的意思是一樣的,都是代碼分支語(yǔ)句万伤。當(dāng)然除了可以作為分支使用蝶念,when表達(dá)式還可以有返回值喘鸟,如:
var person = when(age){
? ? 20 -> Person("張三")
? ? 21 -> Person("李四")
? ? else -> Person("王五") //when表達(dá)式有返回值時(shí)橡卤,必須有else分支,否則會(huì)報(bào)錯(cuò)
}//這樣上面的when表達(dá)式執(zhí)行后的結(jié)構(gòu)會(huì)根據(jù)不同分支的條件榜跌,將不同的對(duì)象賦值給person變量
除了以上的一些語(yǔ)法上的不同以外闪唆,kotlin還對(duì)java的線程進(jìn)行封裝:攜程。攜程是對(duì)線程池的管理和使用钓葫,相對(duì)于java來(lái)說(shuō)悄蕾,對(duì)于線程的控制更加簡(jiǎn)單便捷,但是使用的時(shí)候需要添加庫(kù)瓤逼,如:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"//使用案例? Dispatchers.Main因?yàn)檫@個(gè)的原因笼吟,此代碼塊為主線程
GlobalScope.launch(Dispatchers.Main){
? ? //這里是主線程
? ? getData()//這里因?yàn)榇撕瘮?shù)有suspend的修飾,將函數(shù)改為掛起函數(shù)
? ? //這里還是主線程
}
suspend fun getData(){
//獲取網(wǎng)絡(luò)數(shù)據(jù)? 此時(shí) 此方法為子線程
}
攜程不止這點(diǎn)用法霸旗,還有很多贷帮,憂郁本文只是介紹一下,就不多說(shuō)什么了诱告。
對(duì)于kotlin與java最大的不同還有kotlin省去了java的get和set方法撵枢,或者說(shuō),kotlin默認(rèn)給屬性加上了get和set方法了。
class Person{
? ? var name:String? = null
? ? var age:Int? = null
}
//使用
val person = Person()
Log.v("person>>name"锄禽,person!!.name)
這段代碼中的person!!.name其實(shí)換做java的寫法就是person.getName()潜必。
!!與?和?:的用法
為什么著重說(shuō)一下這三個(gè)的用法沃但,因?yàn)檫@三個(gè)符號(hào)很大程度的減少了kotlin中的空指針異常磁滚。
!!這個(gè)代表調(diào)用時(shí)對(duì)象必須不為空,如果是空那么久直接拋出異常宵晚。
?這代表調(diào)用時(shí)垂攘,對(duì)象如果是空,那么本語(yǔ)句不執(zhí)行
?:使用時(shí)淤刃,可以設(shè)置當(dāng)對(duì)象為空時(shí)的默認(rèn)值晒他,如:name?:"你好Toast".showToast(),這種情況逸贾,當(dāng)name為空的時(shí)候就會(huì)執(zhí)行你好Toast的語(yǔ)句陨仅,有點(diǎn)類似于java的三目運(yùn)算符,不過(guò)铝侵,判斷條件只是空判灼伤。
以上就是java與kotlin的少量區(qū)別,當(dāng)然還有好多區(qū)別哟沫,這里就不一一介紹了饺蔑。
kotlin的優(yōu)點(diǎn)與劣勢(shì)
在使用kotlin的過(guò)程中,讓我最佩服的就是擴(kuò)展函數(shù)嗜诀。
擴(kuò)展函數(shù):擴(kuò)展函數(shù)就是不存的繼承的情況下,仍然可以給指定類型添加功能模塊孔祸。
//定義String的擴(kuò)展函數(shù)
fun String.showToast(){
? ? ToastUtils.showShort(this) //這里的this指向調(diào)用者String這個(gè)對(duì)象
}
//使用擴(kuò)展函數(shù)
"你好隆敢,我是Toast".showToast()?//這里可以直接對(duì)字符串對(duì)象進(jìn)行toast
神奇吧,這個(gè)功能用好了相當(dāng)厲害崔慧。除了擴(kuò)展函數(shù)以外拂蝎,還有函數(shù)類型。
函數(shù)類型Function:kotlin中是支持將函數(shù)作為參數(shù)進(jìn)行使用惶室,當(dāng)然也可以創(chuàng)建函數(shù)類型的變量温自。
var show:( (msg) -> Unit )? = null //這里定義一個(gè)變量為函數(shù)類型,(參數(shù)列表) -> 返回值類型
//調(diào)用函數(shù)
show("你好")//這里就會(huì)直接調(diào)用show變量指向的函數(shù)//也可以將函數(shù)類型放到參數(shù)列表里面來(lái)使用
fun setListener(listener : (view) -> Unit ){
? ? //這里是一種監(jiān)聽...
? ? listener.invoke(view)//這樣調(diào)用listener函數(shù)
}
//調(diào)用setListener方法
setListener{ view ->
? ? //這里就是上面的listener函數(shù)的函數(shù)體
}
還有object對(duì)象皇钞,object對(duì)象定義的內(nèi)容全都可以靜態(tài)訪問(wèn)的悼泌,定義方法簡(jiǎn)單,一般常用與工具類的編寫夹界,object對(duì)象的定義也是相當(dāng)簡(jiǎn)單馆里,和類的定義方法一樣,將class關(guān)鍵字換成object關(guān)鍵字即可。
object ToastUtils{
? ? private lateinit var context:Context //這里為靜態(tài)訪問(wèn)變量
? ? //這里的方法initUtils函數(shù)也是靜態(tài)訪問(wèn)的函數(shù)
? ? fun initUtils(context:Context){
? ? ? ? this.context = context
????}
}
//調(diào)用案例
ToastUtils.initUtils(context)
所以kotlin是支持直接定義靜態(tài)訪問(wèn)類型的鸠踪,相對(duì)java來(lái)說(shuō)丙者,這一點(diǎn)也是方便了很多。
好了今天就聊到這里营密,領(lǐng)導(dǎo)來(lái)了……
總結(jié):kotlin語(yǔ)言優(yōu)化了java的空指針械媒,有效的減少了空指針異常,并且簡(jiǎn)化了大部分java代碼评汰。kotlin還有很多吸引人的語(yǔ)法:when表達(dá)式的返回值滥沫,if表達(dá)式的返回值,!!? ?? ??:的使用键俱,擴(kuò)展函數(shù)兰绣,F(xiàn)uncation類型等等。
望大神多多指點(diǎn)编振。