本文来源:你我学习网 http://www.niwoxuexi.com,转载请备注出处:https://www.niwoxuexi.com/blog/kotlin/article/236.html
一、定义包

包的声明应处于源文件顶部:

packagemy.demoimportjava.util.*//……

目录与包的结构无需匹配:源代码可以在文件系统的任意位置。

注:更多关于包的内容请参考包。

二、定义函数

1,带有两个Int参数、返回 <code>Int 的函数:

//函数funsum(a:Int,b:Int):Int{returna+b}//测试funmain(args:Array<String>){print("sumof3and5is")println(sum(3,5))}

运行结果:sum of 3 and 5 is 8

2,将表达式作为函数体、返回值类型自动推断的函数:

//函数funsum(a:Int,b:Int)=a+b//测试funmain(args:Array<String>){println("sumof19and23is${sum(19,23)}")}

运行结果:sum of 19 and 23 is 42

3,函数返回无意义的值:

//函数funprintSum(a:Int,b:Int):Unit{println("sumof$aand$bis${a+b}")}//测试funmain(args:Array<String>){printSum(-1,8)}

运行结果:sum of -1 and 8 is 7

4,Unit返回类型可以省略:

//函数funprintSum(a:Int,b:Int){println("sumof$aand$bis${a+b}")}//测试funmain(args:Array<String>){printSum(-1,8)}

运行结果:sum of -1 and 8 is 7

注:更多关于包的内容请参考函数

三、定义局部变量

1,一次赋值(只读)的局部变量:

funmain(args:Array<String>){vala:Int=1//立即赋值valb=2//自动推断出`Int`类型valc:Int//如果没有初始值类型不能省略c=3//明确赋值println("a=$a,b=$b,c=$c")}

运行结果:a = 1, b = 2, c = 3

2,可变变量:

funmain(args:Array<String>){varx=5//自动推断出`Int`类型x+=1println("x=$x")}

运行结果:a = 6

注:更多关于包的内容请参考属性和字段。

四、注释

正如 Java 和 JavaScript,Kotlin 支持行注释及块注释。

//这是一个行注释/*这是一个多行的块注释。*/

与 Java 不同的是,Kotlin 的块注释可以嵌套。

注:参考编写 Kotlin 代码文档查看关于文档注释语法的信息。

五、使用字符串模板

funmain(args:Array<String>){vara=1//模板中的简单名称:vals1="ais$a"a=2//模板中的任意表达式:vals2="${s1.replace("is","was")},butnowis$a"println(s2)}

运行结果:a was 1, but now is 2

注:参考字符串模板查看更多字符串模板的信息。

六、使用条件表达式

funmaxOf(a:Int,b:Int):Int{if(a>b){returna}else{returnb}}funmain(args:Array<String>){println("maxof0and42is${maxOf(0,42)}")}

运行结果:max of 0 and 42 is 42

使用if作为表达式:

funmaxOf(a:Int,b:Int)=if(a>b)aelsebfunmain(args:Array<String>){println("maxof0and42is${maxOf(0,42)}")}

运行结果:max of 0 and 42 is 42

注:了解更多请参考if 表达式。

七、使用可空值及null检测

当某个变量的值可以为null的时候,必须在声明处的类型后添加?来标识该引用可为空。</p><p>如果 <code>str 的内容不是数字返回null:

funparseInt(str:String):Int?{//……}

使用返回可空值的函数:

funparseInt(str:String):Int?{returnstr.toIntOrNull()}<spanclass="redactor-invisible-space"></span>funprintProduct(arg1:String,arg2:String){valx=parseInt(arg1)valy=parseInt(arg2)//直接使用`x*y`可能会报错,因为他们可能为nullif(x!=null&&y!=null){//在空检测后,x和y会自动转换为非空值(non-nullable)println(x*y)}else{println("either'$arg1'or'$arg2'isnotanumber")}}<spanclass="redactor-invisible-space">funmain(args:Array<String>){printProduct("6","7")printProduct("a","7")printProduct("a","b")}</span>

运行结果:42

either 'a' or '7' is not a number

either 'a' or 'b' is not a number

或者

funparseInt(str:String):Int?{returnstr.toIntOrNull()}funprintProduct(arg1:String,arg2:String){valx=parseInt(arg1)valy=parseInt(arg2)//……if(x==null){println("Wrongnumberformatinarg1:'${arg1}'")return}if(y==null){println("Wrongnumberformatinarg2:'${arg2}'")return}//在空检测后,x和y会自动转换为非空值println(x*y)}funmain(args:Array<String>){printProduct("6","7")printProduct("a","7")printProduct("99","b")}

运行结果:42

Wrong number format in arg1: 'a'

Wrong number format in arg2: 'b'

注:了解更多请参考空安全。

八、使用类型检测及自动类型转换

is运算符检测一个表达式是否某类型的一个实例。 如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换:

fungetStringLength(obj:Any):Int?{if(objisString){//`obj`在该条件分支内自动转换成`String`returnobj.length}//在离开类型检测分支后,`obj`仍然是`Any`类型returnnull}funmain(args:Array<String>){funprintLength(obj:Any){println("'$obj'stringlengthis${getStringLength(obj)?:"...err,notastring"}")}printLength("Incomprehensibilities")printLength(1000)printLength(listOf(Any()))}

运行结果:'Incomprehensibilities' string length is 21

'1000' string length is ... err, not a string

'[java.lang.Object@77459877]' string length is ... err, not a string

或者

fungetStringLength(obj:Any):Int?{if(obj!isString)returnnull//`obj`在这一分支自动转换为`String`returnobj.length}funmain(args:Array<String>){funprintLength(obj:Any){println("'$obj'stringlengthis${getStringLength(obj)?:"...err,notastring"}")}printLength("Incomprehensibilities")printLength(1000)printLength(listOf(Any()))}

运行结果:

'Incomprehensibilities' string length is 21

'1000' string length is ... err, not a string

'[java.lang.Object@77459877]' string length is ... err, not a string

甚至

fungetStringLength(obj:Any):Int?{//`obj`在`&&`右边自动转换成`String`类型if(objisString&&obj.length>0){returnobj.length}returnnull}funmain(args:Array<String>){funprintLength(obj:Any){println("'$obj'stringlengthis${getStringLength(obj)?:"...err,isemptyornotastringatall"}")}printLength("Incomprehensibilities")printLength("")printLength(1000)}

运行结果:

'Incomprehensibilities' string length is 21 ''

string length is ... err, is empty or not a string at all '1000'

string length is ... err, is empty or not a string at all

注:了解更多请参考类和类型转换。

九、使用for循环

funmain(args:Array<String>){valitems=listOf("apple","banana","kiwi")for(iteminitems){println(item)}}

运行结果:

apple

banana

kiwi

或者

funmain(args:Array<String>){valitems=listOf("apple","banana","kiwi")for(indexinitems.indices){println("itemat$indexis${items[index]}")}}

运行结果:

item at 0 is apple

item at 1 is banana

item at 2 is kiwi

注:了解更多内容请参考for 循环。

十、while循环

funmain(args:Array<String>){valitems=listOf("apple","banana","kiwi")varindex=0while(index<items.size){println("itemat$indexis${items[index]}")index++}}

运行结果:

item at 0 is apple

item at 1 is banana

item at 2 is kiwi

注:了解更多内容请参考while 循环。

十一、When循环

fundescribe(obj:Any):String=when(obj){1->"One""Hello"->"Greeting"isLong->"Long"!isString->"Notastring"else->"Unknown"}funmain(args:Array<String>){println(describe(1))println(describe("Hello"))println(describe(1000L))println(describe(2))println(describe("other"))}

运行结果:

One

Greeting

Long

Not a string Unknown

注:了解更多内容请参考when 表达式。

十二、 使用区间(range)

1,使用in运算符来检测某个数字是否在指定区间内:

funmain(args:Array<String>){valx=10valy=9if(xin1..y+1){println("fitsinrange")}}

运行结果:fits in range

2,检测某个数字是否在指定区间外:

funmain(args:Array<String>){vallist=listOf("a","b","c")if(-1!in0..list.lastIndex){println("-1isoutofrange")}if(list.size!inlist.indices){println("listsizeisoutofvalidlistindicesrangetoo")}}

运行结果:-1 is out of range

list size is out of valid list indices range too

3,区间迭代:

funmain(args:Array<String>){for(xin1..5){print(x)}}

运行结果:12345

3,或数列迭代:

funmain(args:Array<String>){for(xin1..10step2){print(x)}for(xin9downTo0step3){print(x)}}

运行结果:135799630

注:了解更多内容请参考区间。

十三、 使用集合

1,集合迭代:

funmain(args:Array<String>){valitems=listOf("apple","banana","kiwi")for(iteminitems){println(item)}}

运行结果:

apple

banana

kiwi

2,使用in运算符来判断集合内是否包含某实例:

funmain(args:Array<String>){valitems=setOf("apple","banana","kiwi")when{"orange"initems->println("juicy")"apple"initems->println("appleisfinetoo")}}

运行结果:

apple is fine too

1,使用 lambda 表达式来过滤(filter)和映射(map)集合:

funmain(args:Array<String>){valfruits=listOf("banana","avocado","apple","kiwi")fruits.filter{it.startsWith("a")}.sortedBy{it}.map{it.toUpperCase()}.forEach{println(it)}}

运行结果:

APPLE

AVOCADO

注:了解更多内容请参考高阶函数及Lambda表达式。