一,函數:
fun 函數名(參數名:參數類型):返回值類型{
函數體
}
1. fun 是函數的聲明,固定寫法
2.main方法是程序的入口
fun main(args:Array<String>){
println("hello kotlin");
}
3.返回值類型:Unit,代表無返回值,可以省略不寫
二,常見數據類型:
Byte,Short,Int,Long,Float,Double,String(怎麼沒有Boolean和Char)
類型推斷(Type inference) : kotlin會通過類型推斷自動推斷數據類型
var 聲明變量 val聲明常量
字符串模版
"${name}喜歡吃湯圓"
三,if判斷,when表達式,空值處理
kotlin裏面,默認參數是不允許傳null,參數加上?代表可以接受null。這樣就在程序編寫時,避免了空指針異常。
四,loop和range是啥?字符串轉數字?尾遞歸優化?
- var width = 0 ..99 (width的取值是[0,99],閉區間,包含0和99)
..
看做是方法名,調用 0 的rangeTo
方法,傳入 99 作爲參數,會返回一個閉區間對象- var height = 1 until 100 // [1,100) 半開區間,包含1,不包含100
字符串轉數字
var a ="12"
var b =12
a = b.toString()//把數字b轉成字符串存進a
b = a.toInt() //把字符串a轉成數字存進b
關鍵字step步長,從第一個數開始,每隔3個步長取值
for(i in1..5step3)print(i)// 輸出 14
倒序輸出是downTo
//倒序輸出5 4 3 2 1 0
for( i in 5 downTo 0 ){ println(i) }
//step和downTo混合使用
for( i in 5 downTo 1 step 3)
print(i)//輸出52
集合API:reversed反轉集合 count集合總數
★java中如果遞歸次數太多,會造成StackOverflowError,kotlin中利用尾遞歸優化解決
//累加計算 fun main(args: Array<String>){ var result =0L print(ollAdd(100000))//棧溢出異常 print(ollAdd2(100000,result))//正常輸出結果 } fun ollAdd(num :Int):Int{ println("第${num}次運算") return if (num==1) { 1 }else num+ollAdd(num-1) } tailrec fun ollAdd2(num :Long,result:Long):Int{ println("第${num}次運算,運算結果$result") return if (num==0L) { 1 }else ollAdd2(num-1,num+result) }
五,一些思想:面向對象,封裝,繼承,抽象類和多態,接口和抽象類
- 父類中open修飾的方法,纔可以被子類重寫
★接口是事物的能力,抽象類是事物的本質。
六,委託和代理 kotlin代理接口by
- 委託是把事情託付給別人或別的機構辦理
- 代理是指以他人的名義,在授權範圍內進行對被代理人直接發生法律效力的法律行爲。代理的產生,可以是受他人委託。
//洗碗的接口
interface IWashBowl{
fun washing()
}
//大頭兒子類,具備洗碗方法,一次掙一塊錢
class BigHeadSon : IWashBowl{
override fun washing(){
println("我是大頭兒子,我在開心的洗碗,1次賺一塊錢")
}
}
//小頭爸爸也具備洗碗能力,洗一次碗掙10塊錢,但是但是小頭爸爸讓大頭兒子去洗,
class SmallHeadFather:IWashBowl by BigHeadSon(){
override fun washing() {
println("我是小頭爸爸,我在開心的洗碗,1次賺十塊錢")
BigHeadSon().washing()
print("我看着兒子把碗洗完了")
}
}
七,枚舉
enum class Week{
星期一,星期二,星期三,星期四,星期五,星期六,星期日
}
fun main(args:Array<String>){
println(Week.星期五)
}
八,印章類, Sealed class 子類類型有限的class
abstract類的子類可以使任意類型,sealed的子類限定了,只能是類中已定義的。
印章類和枚舉的區別:
★Sealed class 更在意類型,枚舉更在意數據。
九,閉包Closure???
- 讓函數成爲編程語言中的一等公民
- 讓函數具有對象所具有的能力(封裝)
- 讓函數具有狀態
所有:函數、Lambda、if語句、for、when,都可以稱之爲閉包。通常情況下,我們所說的閉包是 Lambda 表達式
下面if 語句是一個閉包。
fun main(args: Array<String>) { test } val test = if (5 > 3) { print("yes") } else { print("no") }
自執行閉包就是在定義閉包的同時直接執行閉包,一般用於初始化上下文環境。 例如:
{ x: Int, y: Int ->
println("${x + y}")
}(1, 3)
十,編程方式 函數式編程
- OOP面向對象編程
- FP 函數式編程
- AOP 面向切面編程 Aspect Oriented Programming
- PO 面向過程編程 Procedure Oriented
函數式編程的優點:
- 簡潔,方便理解
- 方便程序修改和擴展
十一,高階函數
- 一個用函數作爲參數或者返回值的 函數
maxBy函數 獲取最大值
minBy函數 獲取最小值
filter函數 過濾指定條件 接收參數是一個布爾表達式
map函數 某些屬性映射成新的集合
any函數 結果是boolean類型,判斷是否滿足給定的條件
count函數 統計滿足條件的個數
find函數 查找第一個滿足條件的數據
groupBy函數 按條件分組
十二,DSL (領域特定語言Domain Specify Language)
- 擴展函數 :List<T>.myFunction(參數:參數類型){} 給list集合擴展一個myFunction方法
- 中綴表達式 infix :infix修飾的方法,可以用空格代替點來調用方法,是代碼可讀性提高