變量和函數(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é)有一些收獲,但是不足的地方還很多。