前面我們介紹了Kotlin的基本用法,基本用法只是給我們展示了Kotlin最為簡易,最為和善的一面。既然能夠被Google欽點,那也說明Kotlin有其不平凡的偉大之處。下面依然是先介紹部分Kotlin知識,再練習一下Kotlin在Android中的使用,都是從官網學來的,強烈建議官網學習中文/英文。文中若有理解失誤之處,歡迎批評指正。
一:Kotlin習慣用法
(1):創建集合
在Kotlin的世界里,如果我們需要對象,那么基本上不再需要與new打照面了。var 我們在前面介紹中知道,她是可以定義變量和常量的一個關鍵字。比如定義一個整型的變量。
var a=5 //自動推倒,錯了,應該是自動推導
var a:Int=5 //顯示指定變量a為Int類型
同樣,我們也可以用var來定義一個集合
var intList=listOf(-3,-2,-1,0,1,2,3)
這樣我們就可以得到一個整型的集合。我們也可以
var strList=listOf("kot","lin")
生成一個字符串集合。同時我們還可以對這些集合進行過濾操作,比如
var tempList=intList.filter{it>1}
上面這個語句的意思是,在剛才生成的集合基礎上,調用一個filter函數,該函數有個過濾作用,可以將數組中不滿足條件的元素過濾掉,然后將滿足條件的元素生成一個新的集合。其中的it不能更換為其他的阿貓阿狗,還有注意是花括號,這里是約定俗成的寫法。這個語句的另一種寫法是
var tempList=intList.filter{x->x>1}
看起來不明覺厲。其實我也不是很懂哈。
(2):給函數設定默認值
fun test(a:Int=6,b:String="love"){...}
(3):===和==區別
==比較真實的值,而===則比較內存地址,比如下面這樣一個例子
var a=1000 //自動推導為Int類型
var tempA:Int?=a
var tempB:Int?=a
println(a===a)
println(tempA===tempB)
println(a==a)
println(tempA==tempB)
上面這個例子,將會分別輸出true,false,true,true。因為自動裝箱之后,數字不會保留同一性,但會保留相等性。
(4):數字的隱式轉換消失,需要顯示轉換
由于Int 和Long是兩種不同的類型,所以不能進行隱式轉換,需要顯示轉換
var a=100;
var b:Long?=a //這樣是錯誤的,編譯無法通過
不僅這樣,就算將一個Int類型的值和一個Long類型的值進行值的比較也不可以
var a:Int=1000 //自動推導為Int類型
var b:Long=2000
println(a==b) //編譯會報錯
用官網的一句話就是
同一性和相等性都會悄無聲息地消失
那么怎么才能不報錯呢?那就需要顯示轉換
var a:Int=1000 //自動推導為Int類型
var b:Long=2000
println(a.toLong()==b)
每個數字有以下幾種顯示轉換
toByte()
toShort()
toInt()
toLong()
toFloat()
toDouble()
toChar()
當然官網也給了我們一個計算的例子,用來表現隱式轉換并沒有完全消失不見
val a=2L+3 //Long+Int -->Long
這里的變量a就被自動推導為Long類型
(5):創建數組
var strArray=arrayOf(1,2,4)
// 創建一個 Array<String> 初始化為 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })
(6):字符串
在kotlin中字符串分為轉義字符串和原生字符串。轉義字符串類似java中的字符串。原生字符串如下
var strRaw="""abc
bcd \n
|123
|haha
"""
println(strRaw)
輸出如下:
abc
bcd \n
|123
|haha
我們通過上面的輸出可以看出來在原生字符串中,空格,換行,轉義字符,都會原生保留下來。而至于轉義字符串和java非常相似,相信大家都比較熟悉了。
二:離開了findViewById的Kotlin怎生書寫?
前兩天看一個Android-Kotlin開源項目PoiShuhui,項目是一個大二學生寫的,頓時有一種被拍在岸上的感覺??磥砘畹嚼蠈W到老非虛言也,現在的學生追技術,手速比我這老司機還塊啊。打開項目一看,頓時傻眼了。這個FloatingActionButton沒有findViewById啊,也沒有什么注解,到底是為什么可以直接使用呢?
還好有官方文檔,在Android擴展這一小節中,提到只要在build.gradle添加一個插件,就可以讓我們擺脫掉findViewById的困擾。
不知道是不是我理解失誤,明明說的是在項目的build.gradle中添加,我添加了然后沒用,最后還是移到了app中的build.gradle中,插件才起作用。
apply plugin: 'kotlin-android-extensions'
activity:
import kotlinx.android.synthetic.main.activity_about.*
class AboutActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_about)
webview.setWebViewClient(WebViewClient())
webview.loadUrl("http://www.kangaiweishi.com")
}
}
這樣我們布局在layout中的webview的id就可以直接使用了。下面將Kotlin的傳統寫法也列出來
class AboutActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_about)
var web=findViewById(R.id.webview) as WebView
web.setWebViewClient(WebViewClient());
web.loadUrl("http://www.kangaiweishi.com")
// webview.setWebViewClient(WebViewClient())
// webview.loadUrl("http://www.kangaiweishi.com")
}
}
至于這個插件到底起到什么作用呢?官方文檔是這么解釋的
Kotlin Android Extensions is a plugin for the Kotlin compiler, and it does two things:
Adds a hidden caching function and a field inside each Kotlin Activity.
1:The method is pretty small so it doesn't increase the size of APK much.
2:Replaces each synthetic property call with a function call.
這個插件基本上不會增加apk的大小,所以盡管放心使用吧。