准备开始
在源文件的开头定义包名:
packagemy.demoimportjava.util.*//...
包名不必和文件夹路径一致:源文件可以放在任意位置。
更多请参看包(package)
定义一个函数接受两个 int 型参数,返回值为 int :
funsum(a:Int,b:Int):Int{returna+b}funmain(args:Array) { print("sum of 3 and 5 is") println(sum(3,5))}
该函数只有一个表达式函数体以及一个自推导型的返回值:
funsum(a:Int,b:Int)=a+bfunmain(args:Array) { println("sum of 19 and 23 is${sum(19, 23)}")}
返回一个没有意义的值:
funprintSum(a:Int,b:Int):Unit{ println("sum of$aand$bis${a + b}")}funmain(args:Array) { printSum(-1,8)}
Unit 的返回类型可以省略:
funprintSum(a:Int,b:Int) { println("sum of$aand$bis${a + b}")}funmain(args:Array) { printSum(-1,8)}
更多请参看函数
声明常量:
funmain(args:Array) {vala:Int=1//立即初始化valb=2//推导出Int型valc:Int//当没有初始化值时必须声明类型c=3//赋值println("a =$a, b =$b, c =$c")}
变量:
funmain(args:Array) {varx=5//推导出Int类型x+=1println("x =$x")}
更多请参看属性和字段
与 java 和 javaScript 一样,Kotlin 支持单行注释和块注释。
//单行注释/*哈哈哈哈这是块注释*/
与 java 不同的是 Kotlin 的 块注释可以级联。
参看文档化 Kotlin 代码学习更多关于文档化注释的语法。
funmain(args:Array) {vara=1//使用变量名作为模板:vals1="a is$a"a=2//使用表达式作为模板:vals2="${s1.replace("is", "was")}, but now is$a"println(s2)}
更多请参看字符串模板
funmaxOf(a:Int,b:Int):Int{if(a>b) {returna }else{returnb }}funmain(args:Array) { println("max of 0 and 42 is${maxOf(0, 42)}")}
把if当表达式:
funmaxOf(a:Int,b:Int)=if(a>b) aelsebfunmain(args:Array) { println("max of 0 and 42 is${maxOf(0, 42)}")}
更多请参看if表达式
当空值可能出现时应该明确指出该引用可空。
下面的函数是当 str 中不包含整数时返回空:
funparseInt(str:String):Int?{//...}
使用一个返回可空值的函数:
funparseInt(str:String):Int? {returnstr.toIntOrNull()}funprintProduct(arg1:String,arg2:String) {valx=parseInt(arg1)valy=parseInt(arg2)//直接使用 x*y 会产生错误因为它们中有可能会有空值if(x!=null&&y!=null) {//x 和 y 将会在空值检测后自动转换为非空值println(x*y) }else{ println("either '$arg1' or '$arg2' is not a number") } }funmain(args:Array) { printProduct("6","7") printProduct("a","7") printProduct("a","b")}
或者这样
funparseInt(str:String):Int? {returnstr.toIntOrNull()}funprintProduct(arg1:String,arg2:String) {valx=parseInt(arg1)valy=parseInt(arg2)//...if(x==null) { println("Wrong number format in arg1: '${arg1}'")return}if(y==null) { println("Wrong number format in arg2: '${arg2}'")return}//x 和 y 将会在空值检测后自动转换为非空值println(x*y)}
更多请参看空安全
使用 is 操作符检查一个表达式是否是某个类型的实例。如果对不可变的局部变量或属性进行过了类型检查,就没有必要明确转换:
fungetStringLength(obj:Any):Int? {if(objisString) {//obj 将会在这个分支中自动转换为 String 类型returnobj.length }//obj 在种类检查外仍然是 Any 类型returnnull}funmain(args:Array) {funprintLength(obj:Any) { println("'$obj' string length is${getStringLength(obj) ?: "... err, not a string"}") } printLength("Incomprehensibilities") printLength(1000) printLength(listOf(Any()))}
或者这样
fungetStringLength(obj:Any):Int? {if(obj!isString)returnnull//obj 将会在这个分支中自动转换为 String 类型returnobj.length}funmain(args:Array) {funprintLength(obj:Any) { println("'$obj' string length is${getStringLength(obj) ?: "... err, not a string"}") } printLength("Incomprehensibilities") printLength(1000) printLength(listOf(Any()))}
甚至可以这样
fungetStringLength(obj:Any):Int? {//obj 将会在&&右边自动转换为 String 类型if(objisString&&obj.length>0) {returnobj.length }returnnull}funmain(args:Array) {funprintLength(obj:Any) { println("'$obj' string length is${getStringLength(obj) ?: "... err, is empty or not a string at all"}") } printLength("Incomprehensibilities") printLength("") printLength(1000)}
funmain(args:Array) {valitems=listOf("apple","banana","kiwi")for(iteminitems) { println(item) }}
或者
funmain(args:Array) {valitems=listOf("apple","banana","kiwi")for(indexinitems.indices) { println("item at$indexis${items[index]}") }}
参看for循环
funmain(args:Array) {valitems=listOf("apple","banana","kiwi")varindex=0while(index
参看while循环
fundescribe(obj:Any):String=when(obj) {1->"One""Hello"->"Greeting"isLong->"Long"!isString->"Not a string"else->"Unknown"}funmain(args:Array) { println(describe(1)) println(describe("Hello")) println(describe(1000L)) println(describe(2)) println(describe("other"))}
参看when表达式
检查 in 操作符检查数值是否在某个范围内:
funmain(args:Array) {valx=10valy=9if(xin1..y+1) { println("fits in range") }}
检查数值是否在范围外:
funmain(args:Array) {vallist=listOf("a","b","c")if(-1!in0..list.lastIndex) { println("-1 is out of range") }if(list.size!inlist.indices) { println("list size is out of valid list indices range too") }}
在范围内迭代:
funmain(args:Array) {for(xin1..5) { print(x) }}
或者使用步进:
funmain(args:Array) {for(xin1..10step2) { print(x) }for(xin9downTo0step3) { print(x) }}
参看Ranges
对一个集合进行迭代:
funmain(args:Array) {valitems=listOf("apple","banana","kiwi")for(iteminitems) { println(item) }}
使用 in 操作符检查集合中是否包含某个对象
funmain(args:Array) {valitems=setOf("apple","banana","kiwi")when{"orange"initems->println("juicy")"apple"initems->println("apple is fine too") }}
使用lambda表达式过滤和映射集合:
funmain(args:Array) {valfruits=listOf("banana","avocado","apple","kiwi") fruits.filter { it.startsWith("a") }.sortedBy { it }.map { it.toUpperCase() }.forEach { println(it) }}