Kotlin基礎(chǔ)學(xué)習(xí)

變量和函數(shù):
kotlin支持不聲明變量的類型,由結(jié)果自動(dòng)推導(dǎo),注意kotlin變量的聲明使用的var,val關(guān)鍵字

    val a = 10
    println("a = "+a)

當(dāng)然也可以聲明

 //顯示聲明變量的類型
    var a: Int = 10
    a *= 10
    println("a = "+a)

自定義一個(gè)返回最大值的函數(shù),這里很簡(jiǎn)單,就是比較兩個(gè)數(shù)的大小,函數(shù)的聲明使用fun關(guān)鍵字

//自定義一個(gè)返回最大值的函數(shù)
fun largerNumber(num1: Int,num2: Int): Int{
    return max(num1,num2)
}
//調(diào)用函數(shù)
val result = largerNumber(12,20)
    println(result)

語(yǔ)法糖,如果函數(shù)里面只有一行代碼,可以省略成以下形式

fun largerNumber(num1: Int,num2: Int): Int = max(num1,num2)

kotlin中的if語(yǔ)句可以有返回值,就是每一個(gè)if語(yǔ)句最后一行代碼的返回值

fun largerNumber(num1: Int,num2: Int): Int{

    val value = if (num1 > num2){
        num1
    }else{
        num2
    }
    return value
}

使用語(yǔ)法糖省略函數(shù)體

fun largerNumber(num1: Int,num2: Int): Int = if (num1 > num2){
    num1
}else{
    num2
}
//還可以省略括號(hào)
fun largerNumber(num1: Int,num2: Int)= if (num1 > num2) num1 else num2

編寫一個(gè)查詢考試成績(jī)的功能,輸入一個(gè)學(xué)生的姓名,返回該學(xué)生考試的分?jǐn)?shù)

fun getScore(name:String) = if (name == "Tom"){
    86
}else if (name == "Jim"){
    77
}else if (name == "Jack"){
    95
}else if (name == "Lily"){
    100
}else{
    0
}

當(dāng)我們的判斷語(yǔ)句非常多的時(shí)候就應(yīng)該考慮使用when語(yǔ)句

fun getScore(name:String) = when(name){
    "Tom" -> 86
    "Jim" -> 77
    "jack" ->95
    "Lily" -> 100
    else -> 0
}

當(dāng)when語(yǔ)句進(jìn)行類型匹配時(shí),這里的is相當(dāng)于java中的instance of關(guān)鍵字(函數(shù)接收一個(gè)Number類型的參數(shù),這是kotlin一個(gè)內(nèi)置的抽象類,Int,Long,Float,Double等與數(shù)字相關(guān)的都是它的子類)

fun checkNumber(num: Number){
    when(num){
        is Int -> println("number is Int")
        is Double -> println("number is Double")
        else -> println("number not support")
    }
}

when語(yǔ)句不傳入?yún)?shù)

fun getScore(name:String) = when{
    name.startsWith("Tom") -> 86
    name == "Jim" -> 77
    name == "jack" ->95
    name == "Lily" -> 100
    else -> 0
}

kotlin小技巧,表示一個(gè)區(qū)間[0,10],使用..符號(hào)

//閉區(qū)間
val range = 0..10

當(dāng)想表示左閉右開區(qū)間時(shí),使用until關(guān)鍵字

//左閉右開區(qū)間
val range2 = 0 until 10

如果還想降序,使用downTo關(guān)鍵字

val range3 = 10 downTo 1

使用step關(guān)鍵字實(shí)現(xiàn)跳過(guò)某些數(shù)字

fun main(){
    //for循環(huán),可以使用step關(guān)鍵字實(shí)現(xiàn)++i的效果
    for (i in range3 step 2){
        println(i)
    }

Kotlin中聲明一個(gè)類和java類似,都是使用class關(guān)鍵字,當(dāng)然你也可以不傳遞任何參數(shù)給構(gòu)造函數(shù),關(guān)于構(gòu)造函數(shù)我接下來(lái)會(huì)講

class Person(var name : String,var age : Int) {

    fun eat(){
        println(name + " is eating.He is " + age +" years old.")
    }
    
}

Kotlin的構(gòu)造函數(shù)分為主構(gòu)造函數(shù)和次構(gòu)造函數(shù),主構(gòu)造函數(shù)就是上面我提到的在類后面的括號(hào),如果不想使用主構(gòu)造函數(shù)括號(hào)是可以省略的,主構(gòu)造函數(shù)的邏輯部分可以寫在init代碼塊里,但是一般不建議這么做,次構(gòu)造函數(shù)主要使用 constructor關(guān)鍵字,下面的我設(shè)置了初值,不想設(shè)置的也可以不設(shè)置

    //次構(gòu)造函數(shù),將sno和grade賦值為初值
    constructor(name : String,age : Int):this("",0,name, age){

    }
    //this表示調(diào)用第一個(gè)次構(gòu)造函數(shù),并將name和age賦值成初始值
    constructor():this("",0){

    }

創(chuàng)建一個(gè)類對(duì)象,和java不同的是沒(méi)有new關(guān)鍵字

    val student = Student("jack",19)

Kotlin中聲明一個(gè)數(shù)據(jù)類,只需要在前面加一個(gè)data關(guān)鍵字,系統(tǒng)會(huì)自動(dòng)幫你生成 toString,hashCode等方法

data class Cellphone(val brand:String,val price:Double) {

}

集合在kotlin中有許多類型,比如list,map,set等等
聲明一個(gè)list集合,listof表示集合是不可變的,也就是不可以對(duì)他進(jìn)行增刪操作

val list = listOf("Apple","Banana","Orange","Pear","Grape")

可變集合,使用mutableListOf來(lái)進(jìn)行聲明

val mutableList = mutableListOf("Apple","Banana","Orange","Pear","Grape")
//增加一個(gè)新元素
mutableList.add("Watermelon")

Map集合的使用,可以使用put方法添加一個(gè)元素

    val map = HashMap<String,Int>()
    //使用put方法添加元素
    map.put("Apple",1)
    map.put("Banana",2)
    map.put("Orange",3)
    map.put("Pear",4)
    map.put("Grape",5)

put方法可以添加元素,但是一般不推薦使用,可以使用以下方法

    map["Apple"] = 1
    map["Banana"] = 2
    map["Orange"] = 3
    map["Pear"] = 4
    map["Grape"] = 5

mapOf函數(shù)的使用,這種方法使用起來(lái)更方便,這里的to不是關(guān)鍵字,這里就不說(shuō)了

    // mapOf函數(shù)
    val map = mapOf("Apple" to 1,"Banana" to 2,"Orange" to 3,"Pear" to 4,"Grape" to 5)
    for ((fruit,number) in map){
        println("fruit is $fruit,number is $number")
    }

在一個(gè)水果集合中找到單詞最長(zhǎng)的那個(gè)水果,我們常用的方法是使用循環(huán)來(lái)遍歷

//在一個(gè)水果集合中找到單詞最長(zhǎng)的那個(gè)水果
    val list = listOf("Apple","Banana","Orange","Pear","Grape")
    var maxLengthFruit = ""
    for (fruit in list){
        if (fruit.length > maxLengthFruit.length) {
            maxLengthFruit = fruit
        }
    }

println("max length fruit is:" + maxLengthFruit)

但是我更推薦使用 lambda表達(dá)式,因?yàn)閗otlin對(duì)lambda表達(dá)式的支持更好,lambda表達(dá)式的形式就是{參數(shù)1,參數(shù)2->函數(shù)體},這里的maxBy是kotlin的內(nèi)置函數(shù),我們給他傳入了一個(gè)lambda表達(dá)式

    val list = listOf("Apple","Banana","Orange","Pear","Grape")
    val lambda = {fruit:String -> fruit.length}
    val maxLengthFruit = list.maxBy(lambda)

當(dāng)Lambda參數(shù)是函數(shù)的唯一一個(gè)參數(shù)的話,可以將表達(dá)式移到函數(shù)括號(hào)外面,也可以將函數(shù)的括號(hào)省略

    val maxLengthFruit = list.maxBy(){fruit:String -> fruit.length}
    val maxLengthFruit = list.maxBy{fruit:String -> fruit.length}

當(dāng)lambda表達(dá)式參數(shù)只有一個(gè)時(shí),可以省略參數(shù),使用it代替略

val maxLengthFruit = list.maxBy{it.length}

將所有的水果名都大寫

val newList = list.map{it.toUpperCase()}
    for (fruit in newList){
        println(fruit)
    }

只保留5個(gè)字母以內(nèi)的水果,filter也是kotlin的內(nèi)置函數(shù),用于篩選,篩選完,我們?cè)偈褂胢ap函數(shù)將水果名大寫,這里我們先篩選再映射而不是先映射再篩選,更節(jié)約效率

    val list = listOf("Apple","Banana","Orange","Pear","Grape")
    將所有的水果名都大寫
    val newList = list.filter{it.length <= 5}.map { it.toUpperCase() }
    for (fruit in newList){
        println(fruit)
    }

Kotlin中的any函數(shù)用于判斷集合中是否存在元素滿足指定條件

val anyResult = list.any{it.length <= 5}

同理,all函數(shù)用于判斷集合中是否所有元素都滿足指定條件

 val allResult = list.all { it.length <= 5 }

Kotlin中的接口聲明,和java不同的是,java中的接口里的方法是不可以實(shí)現(xiàn)的,kotlin中可以實(shí)現(xiàn),這樣如果外面實(shí)現(xiàn)了這個(gè)接口,不重寫這個(gè)方法是不會(huì)報(bào)錯(cuò)的

interface Study {
    fun readBooks()
    fun doHomeWork(){
        println("do homework default implementation")
    }
}

Kotlin中通常使用?.符號(hào)來(lái)判空,如果為空,則后面的便不會(huì)執(zhí)行

fun doStudy(study: Study?){
    study?.readBooks()
    study?.doHomeWork()
}

還使用let函數(shù)來(lái)判空,如果是空則不執(zhí)行

fun doStudy(study: Study?){
    study?.let {
        it.readBooks()
        it.doHomeWork()
    }
}

如果你不需要判斷是否為空,可以使用!!操作符強(qiáng)行通過(guò)編譯

val content: String? = "hello"
fun printUpperCase(){
    val upperCase = content!!.toUpperCase()
    println(upperCase)

}

除了?.操作符,還有?:操作符,如果?:左邊的表達(dá)式不為空就返回左邊的結(jié)果,同理如果右邊的表達(dá)式不為空就返回右邊的結(jié)果

val a = 1
val b = null
val c = a ?: b
//答案會(huì)返回a,也就是c= 1

編寫一個(gè)函數(shù)來(lái)獲得一段文本的長(zhǎng)度,通常的做法是

fun getTextLength(text: String?): Int{
    if (text != null){
        return text.length
    }
    return 0
}

使用?:操作符

//使用?:操作符
fun getTextLength(text: String?): Int = text?.length ?: 0

Kotlin支持字符串內(nèi)嵌表達(dá)式,與java不同的是,java字符串的拼接通常使用+號(hào),很麻煩,kotlin則直接使用${}符號(hào)來(lái)表示,如果只有一個(gè)變量{}可以省略,如下所示

    val brand = "Samsung"
    val price = 1299.99
    println("Cellphone(brand=$brand, price=$price)")

給函數(shù)參數(shù)傳遞默認(rèn)值

//給函數(shù)參數(shù)傳遞默認(rèn)值
fun printParams(num: Int,str: String = "hello"){
    println("num is $num,str is $str")
}
//通過(guò)鍵值對(duì)傳參
printParams(str = "world",num = 123)

總結(jié),今天學(xué)習(xí)了Kotlin編程中最主要的知識(shí)點(diǎn),包括變量和函數(shù),邏輯控制語(yǔ)句,面向?qū)ο缶幊?,lambda編程等等,感覺(jué)有一些收獲,但是不足的地方還很多。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容