這次Google I/O大會宣布android支持Kotlin作為開發(fā)語言前硫,Kotlin是一種設(shè)計(jì)精妙的語言痛悯,相信回事Android開發(fā)更快更有趣典阵,已經(jīng)被一些主要的開發(fā)商作為應(yīng)用程序開發(fā)所使用攒岛,Kotlin也和Java能夠很好的同時使用舆绎,兩種語言之間可以輕松的相互操作花吟。
Kotlin插件已經(jīng)與Android Studio 3.0綁定了秸歧,所以你現(xiàn)在可以下載Android Studio 3.0的預(yù)覽版使用,Kotlin是被JetBrains公司開發(fā)的衅澈,而Intellij也是由該公司開發(fā)的键菱,所以對于Kotlin的支持并不奇怪。
除了IDEA支持之外今布,Google還宣布與JetBrains進(jìn)行合作,將Kotlin作為一種非盈利的基礎(chǔ)來推動侵蒙。
say "Hello" to Kotlin
Kotlin與java很類似
package helloworld
fun main(args:String){
println("Hello World!");
}
乍一看傅蹂,你會看到大括號纷闺,類,包犁功,方法婚夫,但是隨著學(xué)習(xí)的深入浸卦。例如,也許你會問為什么要實(shí)現(xiàn)一些getter和setter等樣板類代碼以及需要覆蓋equals案糙,hashCode和toString等方法,以下是java語言的典型示例
public class Customer {
private String name;
private String email;
private String company;
public Customer(String name) {
this(name, "", "");
}
public Customer(String name, String email) {
this(name, email, "");
}
public Customer(String name, String email, String company) {
this.name = name;
this.email = email;
this.company = company;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Customer customer = (Customer) o;
if (name != null ? !name.equals(customer.name) : customer.name != null) return false;
if (email != null ? !email.equals(customer.email) : customer.email != null) return false;
return company != null ? company.equals(customer.company) : customer.company == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (email != null ? email.hashCode() : 0);
result = 31 * result + (company != null ? company.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", company='" + company + '\'' +
'}';
}
}
使用Kotlin裆熙,你就不需要寫那些代碼了禽笑,下面這一行代碼與上面的整個類相同
data class Customer(var name:String,var email:String="",var company:String="")
Kotlin歷史
Kotlin的出現(xiàn)已經(jīng)有一段時間了僚稿,在2011年就已經(jīng)被宣布了蟀伸,并且第一次預(yù)覽版在2012年發(fā)布蚀同,Kotlin 1.0版本在2016年發(fā)布,而JetBrains也一直致力于維護(hù)Kotlin的穩(wěn)定性以及兼容性啊掏。
你可以在https://kotlinlang.org找到優(yōu)秀的學(xué)習(xí)資料和參考資料蠢络,Android團(tuán)隊(duì)發(fā)現(xiàn)Kotlin Koans教程作為開始編寫Kotlin片段的一種快速學(xué)習(xí)方式是非常有用的,這些教程的范圍從簡單到復(fù)雜迟蜜。
為什么是Kotlin
為什么Android團(tuán)隊(duì)決定支持Kotlin刹孔,最重要的是,這是因?yàn)閍ndroid團(tuán)隊(duì)認(rèn)為Kotlin是一種偉大的語言娜睛,將使Android應(yīng)用程序開發(fā)起來更輕松髓霞,更愉快。
Kotlin也是現(xiàn)有Android生態(tài)系統(tǒng)的絕佳搭檔畦戒,他與Java語言100%兼容方库,你可以根據(jù)需要將Kotlin添加到現(xiàn)有的代碼庫中,并且在同一個項(xiàng)目中自由使用兩種語言障斋。
最終纵潦,很多開發(fā)者都說他們很喜愛Kotlin變成語言,Android官方團(tuán)隊(duì)的很多開發(fā)者也這樣說垃环,已經(jīng)有一個熱衷于Android的Kotlin開發(fā)社區(qū)邀层,Android團(tuán)隊(duì)經(jīng)常在公開活動中對Kotlin提出疑問,而且已經(jīng)得到了反饋晴裹。
快速預(yù)覽
為了幫助你們了解Kotlin被济,這里有一個快速的但是不完整的Kotlin之旅。
Nullable
Kotlin編譯器強(qiáng)制可以顯示的聲明可以為空值的變量涧团。因此在運(yùn)行過程中不會出現(xiàn)空指針異常只磷。
var neverNull: String="something"
var mightBeNull:String?=null //?表明可以為null
if(neverNull.length>0){
}
if(mightBeNull.length>0){ //編譯器會捕獲這個錯誤
}
命名參數(shù)和默認(rèn)的參數(shù)
fun orderPizza(size: Size, pepperoni: Boolean, mushrooms: Boolean,
ham: Boolean, pineapple: Boolean, pickles: Boolean,
sausage: Boolean, peppers: Boolean, onion: Boolean)
{
...
}
// Wait… did I just order pickles on my pizza?
// Why do we even have that option?
orderPizza(Size.LARGE, true, false, false, false, true,
false, true, false)
設(shè)置默認(rèn)值
fun orderPizza(size: Size,
pepperoni: Boolean = false,
mushrooms: Boolean = false,
ham: Boolean = false,
pineapple: Boolean = false,
pickles: Boolean = false,
sausage: Boolean = false,
peppers: Boolean = false,
onion: Boolean = false)
{
...
}
orderPizza(Size.LARGE, ham = true, mushrooms = true)
這樣寫減少了需要重載的函數(shù)的數(shù)量
when表達(dá)式
when{
password.equals("password") -> println("Insecure password")
password.length < 4 -> println("Too short")
else -> {
println("Secure password")
}
}
智能轉(zhuǎn)換
如果你需要將一個對象轉(zhuǎn)換成另外一個對象的時候,需要使用instance of來進(jìn)行測試泌绣,但是Kotlin就不需要這么做了
if(obj is String){
//編譯器將obj轉(zhuǎn)換成String
if(obj.length>0){
...
}
}
Kotlin中
when (obj){
is Cat -> obj.meow(...)
is Dog -> obj.woof(...)
else -> {
}
}
擴(kuò)展方法
Kotlin將新方法定位到現(xiàn)有的類型上钮追,如果你希望String類有一個toPigLain方法,你可以自己添加阿迈,而無需創(chuàng)建一個新的幫助類元媚。
//"String."表明這些方法應(yīng)該繼承現(xiàn)有的String類
fun String.toPigLatin():String{
...
}
val plainOldString:String = "some text"
println("some text".toPigLatin())
解構(gòu)賦值
我們前面已經(jīng)見識到了可以輕松定義一個簡單的類:
data class Order(val itemCode:String,val quantity:Int,val price:Float)
fun getOrder(...):Order{
return Order(itemCode,quantity,price)
}
要得到所有的方法,你可以使用解構(gòu)聲明語法,以下語句使用Order對象刊棕,提取其三個屬性炭晒,然后分配給三個變量,這些變量都是由Kotlin編譯器提供的甥角,這里為你推薦了正確的類型网严。
val(what,howMany,howMuch) = getOrder(...)
lambdas表達(dá)式
Kotlin對于Lambda有非常簡潔的語法,可以很容易表達(dá)強(qiáng)大的變成范例嗤无,這是一個簡單的例子震束,它使用lambda來測試集合中的所有內(nèi)容都是String:
fun allString(collection:Collection) = collection.all{it is String}
fun generatePage(withEmphasis : Boolean) {
val result =
html {
head {
title { +"Kotlin Builders" }
}
body {
h1 { +"Kotlin Builders" }
p {
+"This is "
if (withEmphasis) b { +"really " }
+"interesting"
a() { +"More here" }
}
}
}
println(result)
}
入門
如果你想使用Kotlin入門,你可以直接使用這個代碼当犯,在你的app中嘗試使用Kotlin垢村,通過如下步驟:
- 下載Android Studio 3.0
- 打開已經(jīng)存在的java文件
- 調(diào)用Code > convert java file to kotlin file
IDE將會添加Kotlin依賴到你的項(xiàng)目中,然后轉(zhuǎn)換java代碼到koelin代碼嚎卫。
參考文章
原文地址:https://android-developers.googleblog.com/2017/05/android-announces-support-for-kotlin.html
Kotlin入門:https://developer.android.com/kotlin/get-started.html
Kotlin學(xué)習(xí)資料:https://developer.android.com/kotlin/resources.html