簡(jiǎn)介:
最近公司開(kāi)展了一個(gè)新項(xiàng)目,自己考量了一下決定用kotlin來(lái)寫(xiě).那么分享一下我的學(xué)習(xí)歷程,希望對(duì)您有所幫助
-
implementation "org.jetbrains.anko:anko:0.10.8"
anko是使用kt語(yǔ)言來(lái)編寫(xiě)的一個(gè)android增強(qiáng)庫(kù),封裝了很多東西,使我們的操作更加簡(jiǎn)化. - kt有自動(dòng)映射功能,xml寫(xiě)了id,直接可以在kt中使用,無(wú)需findViewByid,直接把控件id當(dāng)作對(duì)象使用即可.
數(shù)據(jù)類(lèi)型
A:數(shù)據(jù)類(lèi)型跟java一樣(寫(xiě)法不一樣)分別都有:
Int Long Folat Double Boolean Char String
轉(zhuǎn)換的話--> i.toInt...其他方法一樣
B:數(shù)組(數(shù)組其實(shí)也是大同小異,只不過(guò)String的時(shí)候有一些區(qū)別)
IntArray LongArray FolatArray DoubleArray BooleanArray CharArray
使用: var long:LongArray =longArrayOf(1,2,3)
使用StringArray: var string:Array<String> = arrayOf("哈","哈","大","笑")
C:集合的話跟Java都一些不一樣:kt分為只讀跟可變,就跟val跟var一樣(前面是只讀,后面是可變)
Set MutableSet List MutableList Map MutableMap
使用: var list:MutableList = listOf("1","2","3","4")
Map使用有一些不一樣 (2種方式初始化,個(gè)人喜歡第一種,簡(jiǎn)單清晰)
val mapList: Map<String, String> = mapOf(Pair("1", "王濤"), Pair("2", "王飛"), Pair("3", "王偉"))`
`val mapList1: Map<String, String> = mapOf("1" to "王濤", "2" to "王飛", "3" to "王偉")
D:循環(huán): for-in forEach 迭代器遍歷(非常不喜歡)
for (item in mapList) {
string = "內(nèi)容: ${item.key} --- ${item.value}"
toast(string)
}
mapList.forEach { key, value ->
string = "${string} 大家:${key} -- ${value}"
}
控制語(yǔ)句
A:條件分支:if-else基本沒(méi)改動(dòng) swtich defult 改成 when else
tv.text = if(a == 1){"a 等等于 1"} else {"a 不等于 1"}
tv.text = when(t.text){
"1" -> "2"
"2" -> "3"
else ->"成功了"
}
B:等式判斷: kt中String判斷也可以使用 == .還有一種方式是 === 三個(gè)等號(hào),自己去研究一下,是跟clone有關(guān)
C:is 和 in: instanceof == is (校驗(yàn)變量是否為某種類(lèi)型)
in:java 中沒(méi)有這個(gè)東西,他是判斷數(shù)組或者集合中,存不存在此參數(shù) (變量名 in 數(shù)組名)
D:條件循環(huán): 比如從20-100循環(huán)偶數(shù) 恐怕之前的循環(huán)就做不到了.所以這邊有條件循環(huán)
for(i in 10 until 22){ 這是10-20 包括10 但是不包括20}
for(i in 20 downTo 10) { 循環(huán)遞減 從20遞減到10 其中20跟10都包括}
for(i in 10 .. 20 step 2){每次循環(huán)遞增2,其中包括10跟20,可以把..改成until,這樣就只包括10}
E:跳出多層循環(huán): outside@ while(){....break@outside} outside可以隨便起名字 重要的是@符號(hào)
fun ss() {
var i = 1
outSide@ while (i<100000){
if (i == 50){
break@outSide
}
}
}
F:swtich去掉了,改成了when,寫(xiě)法如下
when (10) {
1 -> 0
2 -> 1
else -> 2
}
函數(shù)的基本用法
- A:Java中使用@Override 表示改函數(shù)重載父類(lèi)的方法,kt使用小寫(xiě)的 override 在同一行表達(dá)重載操作
- B:Java中使用 public 表示該函數(shù)是公公方法,kt默認(rèn)函數(shù)是公開(kāi),所以省略了public(省略不代表沒(méi)有)
- C:Java中使用 void 表示改函數(shù)沒(méi)有返回參數(shù),kt不存在關(guān)鍵字 void(這個(gè)是沒(méi)有)
- D:kt新增fun,類(lèi)似于Java中的class
- E:Java的參數(shù)格式是:(變量類(lèi)型 變量名稱(chēng) 舉例:String str) kt(變量名稱(chēng):變量類(lèi)型 舉例:str:String)
- F:kt引入了空安全機(jī)制,如果某個(gè)變量允許為空,就需要在變量類(lèi)型后面加個(gè)? val string: String? = "123"
over fun onCreate(...)
fun getText(str:String,age:Int):String{
return string
}
//這樣就不用全部傳入了 只需要傳入age
fun getText(age:String,str: String = "王濤", inte: Int = 2): String {
return "$str 第 $inte 次進(jìn)入"
}
可變參數(shù)
- Java中是(String... args) kt中是(vararg args:String)
fun getVarText(vararg other: String): String {
var str = ""
return str
}
泛型函數(shù)
- 上面都說(shuō)傳入基本類(lèi)型的比如(int,String,Double...),在開(kāi)中傳入集合,數(shù)組等也是很有必要的
fun <T> getListVararg(vararg other: T): String {
var str = ""
for (item in other) {
str = "$str 哈嘍- $item \n"
}
return str
}
內(nèi)聯(lián)函數(shù)
-必須這么寫(xiě),將<T>改為<reified T:Number>,同時(shí)必須在fun前面添加關(guān)鍵字inline 他跟上面的泛型函數(shù)的區(qū)別是,不支持多個(gè),并且可以返回 T 類(lèi)型
//這是Map
inline fun <reified T : String> getTextMap(other: Map<T, T>): String {
var str = ""
for (item in other) {
str = "$str 哈嘍- ${item.key} -- ${item.value} \n"
}
return str
}
//這是List (返回list<T> 范型函數(shù)沒(méi)辦法返回List<T>)
inline fun <reified T : String> getTextList(other: List<T>): List<T> {
return other
}
簡(jiǎn)化函數(shù)
- 我認(rèn)為他就是一個(gè)遞增循環(huán)(自己調(diào)用自己),適合54321這種方式來(lái)用簡(jiǎn)化函數(shù)
//如果n==1, 輸出的結(jié)果就是 5*4*3*2*1的結(jié)果
fun factorial(n:Int):Int = if(n<1)n else n*factorial(n-1)
同步j(luò)ava
在方法后面加入 @JvmOverloads constructor 這段代碼 他就會(huì)給我去自動(dòng)的同步j(luò)ava
companion object {} == static 同時(shí){}里面可以方靜態(tài)方法