類型推導
在java中我們定義變量格式為
類型 變量 = 值,需要聲明類型
例如:
String str = "hello world"
int i =2;
Kotlin
var/val 變量 = 值
val str = "hello world"
val i = 2
函數返回值視情況聲明返回值類型
一般情況建議聲明,使用單行表達式與等號可以省略聲明
fun sum(x : Int,y : Int) = x + y
總結需要聲明的情況:
1.如果變量是一個函數的參數,則必須使用
2.如果它是一個遞歸函數,則必須使用
3.如果他是一個非表達式函數,則除了返回Unit,其他情況必須使用
Unit:相當于Java的void,也是一種數據類型
表達式:可以返回值得語句,例如:"kotlin".length //返回值為6
變量聲明
var 可以聲明變量
val 為常量,為var + final
由于變量存在被修改的可能,很多副作用的產生都是與可變數據及共享狀態有關,所以我們在開發過程中盡量使用val和不可變對象來減少這種情況,在定義局部變量時使用var更加適合,它占用的內存更少,如得到集合中值的和,用var很簡潔,用val得用遞歸
函數聲明
1.高階函數
使用函數作為參數
data class Country(val name: String,val continient : String,val population : Int)
fun fileterCountries(contries : List<Country>,test : (Country)->Boolean) : List<Country>{
val res = mutableListOf<Country>()
for (c in contries){
if(test(c)){
res.add(c)
}
}
return res
}
class Book(var name : String){
fun printName(){
// Log.e(TAG,this.name)
}
fun isBigEuropeanCountry(contry : Country) : Boolean{
return contry.continient == "亞洲" && contry.population >= 1000
}
}
val countrys = listOf(Country("中國","亞洲",12121),Country("日本","亞洲",232))
fileterCountries(countrys,book::isBigEuropeanCountry)
上面的函數的參數為條件函數,其中 ::實現了類的方法進行引用
Lambda
條件:
1.一個lambda表達式必須通過{}來包裹
2.如果Lambda聲明了參數部分的類型,且返回值類型支持類型推導,那么lambda變量就可以省略函數類型聲明
3.如果lambda變量聲明了函數類型,那么lambda的參數部分的類型就可以省略
val foo = {x : Int->
val y = x+1
}
Enum、When、For用法
Enum
enum class Day{
MON,
TUE,
WEN,
THU,
FRI,
SAT,
SUN
}
When
fun schedule(sunny : Boolean,day : Day) = when(day){
Day.SAT -> Log.e(TAG,"sat")
Day.SUN -> Log.e(TAG,"finish")
Day.FRI -> Log.e(TAG,"appointment")
else -> when{
sunny -> Log.e(TAG,"library")
else -> Log.e(TAG,"study")
}
}
for
for (i in 1..4) print(i) // 打印結果為: "1234"
for (i in 4 downTo 1) print(i) // 打印結果為: "4321"
for (i in 1..4 step 2) print(i) // 打印結果為: "13"
for (i in 4 downTo 1 step 2) print(i) // 打印結果為: "42"
for (i in 1 until 10) { // i in [1, 10), 不包含 10
println(i)
}
String
字符串拼接
fun message(name: String,lang:String) = "Hi${name},welcome to${lang}!"
val str = message("Shaw","Kotlin")
Log.e(TAG,str)//結果 : HiShaw,welcome toKotlin!
字符串 ==判斷兩個對象內容是否相等,===是判斷兩個對象引用是否相等