30分钟了解Kotlin基本语法
一、定义包
包的声明应处于源文件顶部:
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表达式。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。