Kotlin學習筆記一基礎語法

一,函數:

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修飾的方法,可以用空格代替點來調用方法,是代碼可讀性提高
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章