package jichuyufa
/*
默認導入
kotlin.*
kotlin.annotation.*
kotlin.collections.*
kotlin.comparisons.*
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
*/
//-------------------函數定義------------------------
//格式 : fun 函數名 (參數:參數類型...) : 返回值類型{ 執行的語句}
fun sum(a:Int,b:Int):Int{ return a+b}
// 只有一條返回語句的方法,可以由編譯器自己判斷返回的類型。
fun sum2(a:Int,b:Int)=a+b
//public 方法必須明確寫出返回值的類型
public fun sum3(a:Int,b:Int):Int=a+b
//無返回值的函數,需要用Unit類型作為返回值,也可以省略
fun printSum(a:Int,b:Int):Unit{print(a+b)}
//省略
fun printSum2(a:Int,b:Int){print(a+b)}
//測試
/fun main(args: Array<String>) {
sum(1,2)
sum2(1,2)
sum3(1,2)
printSum(1,2)
printSum2(1,2)
}/
//-----------------可變長參數--------------------------
//多個相同的參數,可以使用可變長參數 使用關鍵字vararg進行標識
fun vars(vararg v:Int){
for(vt in v)
print(vt)
}
//測試
/fun main(args: Array<String>) {
vars(1,2,3,4,5)//輸出12345
}/
//---------------lambda匿名函數-----------------
/fun main(args: Array<String>) {
val sumLambda:(Int,Int)->Int={x,y->x+y}
println(sumLambda(1,2))//輸出3
}/
//-------------定義常量與變量-------------------
//可變變量定義var關鍵字 || 格式:var 變量名:類型=初始化的值
//不可變變量類似于java中的final val關鍵字 || 格式:val 變量名:類型=初始化值
//kotlin中常量和變量均可以沒有初始化值,但是在引用前必須初始化,編譯器支持自動類型判斷,可以不指定類型。
/fun main(args: Array<String>) {
val a:Int=1
val b=1 //系統自動推斷變量類型為int
val c:Int //不在聲明時初始化,必須提供變量類型
c=1// 明確賦值
var x=5//系統自動推斷變量的類型為int
x+=1 //變量可修改
println(""+a+","+b+","+c+","+x)
}/
//------------注釋------------
//與java的注釋一樣,但是kotlin的注釋可以嵌套
//-------------字符串模板----------------
/*
$ 表示一個變量名或者變量值
$varName 表示變量值
${(varName.fun()} 便是變量的方法返回值
*/
/*fun main(args: Array<String>) {
var a=1
//模板中的簡單名稱:
val s1="a is $a"
println(s1)//a is 1
a=2
//模板中的任意表達式
val s2="${s1.replace("is","was")},but now is $a"
println(s2)//a was 1,but now is 2
}*/
//--------------Null檢查機制------------------
/*
Kotlin 的空安全設計對于聲明為空的參數,在使用時要進行空判斷處理,有兩種處理方式
一:字段后加!! 像java一樣拋出空異常
二:字段后加? 可不做處理返回值為null或配合?: 做空判斷處理
*/
/*fun main(args: Array<String>) {
//類型后面加?表示可以為空
var age:String?=null
println(age) //null
//拋出空指針異常
val ages=age!!.toInt()
println(ages) //null異常
//不做處理返回null
val ages1=age?.toInt()
println(ages1)//null
//age為空返回-1
val ages2=age?.toInt()?:true
println(ages2)//若為null 返回true
//當一個引用為null值時,對應的類型聲明必須明確的標識為null
//當str中的字符串內容不是一個整數時,返回null
fun parseInt(str:String):Int?{
if(str.equals("a"))
return null
return Integer.parseInt(str)
}
val x=parseInt("a")
println(x)//返回null
if(x!=null) println(x) //經過null檢查之后會自動轉換成非null類型
}
*/
//--------------類型檢測及自動類型轉換---------------
//我們可以使用is運算符檢測一個表達式時候某類型的一個實例 類似于java中的instanceof關鍵字
fun getStringLength(obj:Any):Int?{
if(obj is String) return obj.length
return null
//還有另一種方法 與 java的 instanceof不同 使用!is
/*if(obj !is String)
return null*/
}
//或者
fun getStringLength2(obj:Any):Int?{
if(obj !is Int)return null
//在此之前obj仍是Any類型的引用,在這里會被自動轉換成String
return obj
}
//也可以
fun getStringLength3(obj:Any):Int?{
//在&&運算符的右側,obj會被自動轉換成String
if(obj is String && obj.length>0)
return obj.length
return null
}
/*fun main(args: Array<String>) {
println(getStringLength("aaaaa"))
println(getStringLength2(3))
println(getStringLength3("aaaaa"))
}
*/
//-------------區間--------------------
//區間表達式具有操作符形式.. 的rangeTo 函數輔以in和!in 形成
//區間是為任何可以比較類型定義的,但對于整型原生類型,他有一個優化的實現。
fun main(args: Array<String>) {
for(i in 1..4) print(i)//輸出1234 閉區間【】
println()
for(i in 4..1)print(i)//什么都不輸出 a<=i<=b 即 4<=i<=1
println()
for(i in 1..10)print(i)//輸出1-10 等價于 a<=i<=b 即 1<=i<=10
println()
//使用step 指定步長
for(i in 1..4 step 2) print(i) //等價于 a<=(i+=2滯后計算)<=b
println()
//倒序可以使用downTo
for(i in 4 downTo 1 step 2) print(i)
//使用until 排除元素 可變成模仿開區間
println()
for(i in 1 until 10) print(i) //【1,10)
}
fun test(){}
class Runoob{}