Kotlin語法學習(上)

前言

本人主要學習android開發,之前一直用的編程語言是java。Google在2019年的I/O大會上宣佈Kotlin已經成爲Android開發的第一語言,更加推薦使用Kotlin來編寫Android應用程序。說實話,我剛開始是有點抵觸情緒的,哎,java寫的好好的,又得去學習新的Kotlin語法,太難了。但是沒辦法,總得擁抱變化吧。那就學咯,在此記錄下Kotlin的語法,方便自己查閱,也方便廣大網友查閱。打算分爲兩篇寫,一篇是基本語法,一篇寫一些高級用法吧。下面先來第一篇。

1. 變量

val:申明一個不可變的變量 val a = 10
var:申明一個可變的變量 var b = 20

2. 函數

語法規則如下:

fun methodName (param1:Int, param2:Int):Int{
	return 0 
}

3. if語句

跟java語法類似,下面演示寫一個函數返回兩個參數中的最大值

fun largeNumber(num1:Int,num2:Int)=if(num1>num2) num1 else num2

4. when語句

kotlin 語句比java的switch語句好用些

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

5. 循環語句

(1)while循環和java一樣,並無特殊

(2)for循環花樣多一些

for(i in 0..10){ //打印0到10
	println(i)
}

6. 類與對象

class Person{
	var name=""
	var age=0
	fun eat(){
	}
}
//實例化
val p=Person()

7. 類的繼承

kotlin類默認不可繼承,要被繼承得在類前面申明open

open class Person{
//do something
}

Student類繼承Person,用:修飾符

class Student:Person(){
}

8. 構造函數

kotlin中有主構造函數和次構造函數,主構造函數沒有函數體,可以用init塊做一些初始化操作,如下:

class Student(val sno:String,val grade:Int):Person(){
	init{
	println("sno is"+sno)
	}
}

由於kotlin提供一個給函數設定參數默認值的功能,一定程度上可以代替次構造函數,所以次構造函數一般不會用到(次構造函數通過constructor關鍵字來定義)

9. 接口

interface Study{
	fun readBooks()
	fun doHomework()
}

接口的實現:

class Student(val sno:String,val grade:Int):Person(),Study{
	init{
	}
	override fun readBooks(){
	}
	override fun doHomeworks(){
	}
}

注意接口中的方法可以有默認實現

10. 數據類和單例類

data class Student(val sno:String,val grade:Int)

data關鍵字表明這個類是一個數據類,kotlin會自動生成equals()、hashCode()、toString()等固定且無實際意義的方法

object Singleton{
}

object關鍵字表明這是一個單例類

11. 集合類

val list1=listOf("Apple","Banana","Orange","Pear")
for(fruit in list1){
	println(fruit)
}

val list2=mutableListOf("Apple","Banana","Orange","Pear")
list2.add("Grape")

mutableListOf和listOf的區別是mutableListOf是可變的,所以可以用add方法
類似的,有setOf和mapOf

val set=setOf("Apple","Banana","Orange","Pear")
val map=mapOf("Apple" to 1,"Banana" to 2,"Orange" to 3,
"Pear" to 4)

12. 集合的函數式API

maxBy、map、filter、any、all等

val list1=listOf("Apple","Banana","Orange","Pear")
//簡化版
val maxLengthFruit1=list1.maxBy{it.length}
//原版
val maxLengthFruit2=list1.maxBy({fruit:String->fruit.length})

val newList=list1.filter{it.length<=5}.map{it.toUpperCase()}
val anyResult=list1.any{it.length<=5}//true
val allResult=list1.all{it.length<=5}//false

13. Java函數式API的使用

常用的有以下兩種簡便使用方法

//開線程
Thread{
println("Thread is running")
}.start()

//綁定點擊事件
button.setOnClickListener{
}

14. 空指針檢查

(1)?.操作符表示當對象不爲空時正常調用相應方法,當對象爲空時什麼也不做

if(a!=null){
	a.doSomething()
}
//等價於
a?.doSomething()

(2)?:操作符左右兩邊都接收一個表達式,如果左邊表達式的結果不爲空就返回左邊表達式的結果,否則返回右邊表達式的結果

val c=if(a!=null){
	a
}else{
	b
}
//等價於
val c=a?:b

(3)!!操作符意在告訴kotlin,我非常確信這裏的對象不會爲空,所以不用你來幫我做空指針檢查了,來看個例子

var content:String?="hello"
fun main(){
	if(content!=null){
		printUpperCase()
	}
}
fun printUpperCase(){
	val upperCase=content.toUpperCase()
	println(upperCase)
}

上面這段代碼看上去沒啥問題,但實際上編譯不通過。因爲printUpperCase()函數並不知道外部已經對content變量進行了非空檢查,在調用toUpperCase()方法時,還認爲存在空指針風險,因此編譯不通過。解決辦法是用!!操作符

fun printUpperCase(){
	val upperCase=content!!.toUpperCase()
	println(upperCase)
}

(4)let函數,一個輔助工具,可以做到全局判空,而if不行

fun doStudy(study:Study?){
    study?.readBooks()
    study?.doHomework()
}
//等價於
fun doStudy(study:Study?){
    study?.let{ stu->
        stu.readBooks()
        stu.doHomework()
    }
}
//只有一個參數,可以簡化爲
fun doStudy(study:Study?){
    study?.let{
        it.readBooks()
        it.doHomework()
    }
}

15. 字符串內嵌表達式

"hello,${obj.name}.nice to meet you!"

16. 函數的參數默認值

fun main(){
   printParams(str="world")
}
fun printParams(num:Int=100,str:String){
    println("num is $num,str is $str")
}

更多kotlin語法特性,可以參考另一篇博客
Kotlin語法學習(下)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章