Kotlin的特性
- 它更加易表現(xiàn):這是它最重要的優(yōu)點(diǎn)之一愕难。你可以編寫少得多的代碼偎快。
- Kotlin是一種兼容Java的語言
- Kotlin比Java更安全顷链,能夠靜態(tài)檢測常見的陷阱橄抹。如:引用空指針
- Kotlin比Java更簡潔蜜笤,通過支持variable type inference濒蒋,higher-order functions (closures),extension functions把兔,mixins and first-class delegation等實(shí)現(xiàn)
- Kotlin可與Java語言無縫通信沪伙。這意味著我們可以在Kotlin代碼中使用任何已有的Java庫;同樣的Kotlin代碼還可以為Java代碼所用
- Kotlin在代碼中很少需要在代碼中指定類型县好,因?yàn)榫幾g器可以在絕大多數(shù)情況下推斷出變量或是函數(shù)返回值的類型围橡。這樣就能獲得兩個好處:簡潔與安全
Kotlin優(yōu)勢
- 全面支持Lambda表達(dá)式
- 數(shù)據(jù)類Data classes
- 函數(shù)字面量和內(nèi)聯(lián)函數(shù)Function literals & inline functions
- 函數(shù)擴(kuò)展Extension functions
- 空安全Null safety
- 智能轉(zhuǎn)換Smart casts
- 字符串模板String templates
- 主構(gòu)造函數(shù)Primary constructors
- 類委托Class delegation
- 類型推判Type inference
- 單例Singletons
- 聲明點(diǎn)變量Declaration-site variance
- 區(qū)間表達(dá)式Range expressions
上面說簡潔簡潔,到底簡潔在哪里缕贡?這里先用一個例子開始翁授,在Java開發(fā)過程中經(jīng)常會寫一些Bean類:
public class Artist {
private long id;
private String name;
private String url;
private String mbid;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMbid() {
return mbid;
}
public void setMbid(String mbid) {
this.mbid = mbid;
}
}
使用kotlin
class Artist {
var id: Long = 0
var name: String? = null
var url: String? = null
var mbid: String? = null
}
這個數(shù)據(jù)類拣播,它會自動生成所有屬性和它們的訪問器,以及一些有用的方法
空安全
當(dāng)我們使用Java開發(fā)的時候收擦,我們的代碼大多是防御性的贮配。如果我們不想遇 到 NullPointerException ,我們就需要在使用它之前不停地去判斷它是否為 null塞赂。Kotlin泪勒,如很多現(xiàn)代的語言,是空安全的减途,因?yàn)槲覀冃枰ㄟ^一個 安全調(diào)用操 作符 (寫做 ? )來明確地指定一個對象是否能為空
// 這里不能通過編譯.
Artist 不能是null var notNullArtist: Artist = null
// Artist 可以是 null var
artist: Artist? = null
// 無法編譯, artist可能是null酣藻,我們需要進(jìn)行處理
artist.print()
// 只要在artist != null時才會打印
artist?.print()
// 智能轉(zhuǎn)換. 如果我們在之前進(jìn)行了空檢查,則不需要使用安全調(diào)用操作符調(diào)用
if (artist != null)
{
artist.print()
}
// 只有在確保artist不是null的情況下才能這么調(diào)用鳍置,否則它會拋出異常
artist!!.print()
// 使用Elvis操作符來給定一個在是null的情況下的替代值
val name = artist?.name ?: "empty"
函數(shù)式支持
每次我們?nèi)ヂ暶饕粋€點(diǎn)擊所觸發(fā)的事件辽剧,可以只需要定義我們需要做些什么,而不 是不得不去實(shí)現(xiàn)一個內(nèi)部類税产?我們確實(shí)可以這么做怕轿,這個(或者其它更多我們感興 趣的事件)我們需要感謝lambda:
view.setOnClickListener { toast("Hello world!") }