kotlin 官方学习教程之基础语法详解
kotlin官方学习教程之基础语法详解
Google在今天的举行了I/O大会,大会主要主要展示内有容AndroidO(Android8.0)系统、GoogleAssistant语音助手、Google智能音箱、人工智能、机器学习、虚拟现实等。作为一个Android开发者,我关心的当然是AndroidO(Android8.0)系统了,那么关于AndroidO系统的一个重要消息是全面支持Kotlin编程语言,使得Kotlin成为了Android开发的官方语言,被称为Android开发中的Swift的它有什么优势,又到底会为Android开发者带来什么,还需要时间来观察。但是作为开发者的我们,已经可以明确的知道Kotlin是接下来Android开发的官方语言,所以,今天就为大家翻译一下kotlin官方文档。
基础语法
定义包名
包名应该在源文件的顶部定义:
packagemy.demo importjava.util.* //...
定义函数
带有两个Int型参数和Int返回类型的函数
funsum(a:Int,b:Int):Int{ returna+b } funmain(args:Array){ print("sumof3and5is") println(sum(3,5)) }
带有具体表达式并可以推测返回类型的函数
funsum(a:Int,b:Int)=a+b funmain(args:Array){ println("sumof19and23is${sum(19,23)}") }
返回无意义值的函数
funprintSum(a:Int,b:Int):Unit{ println("sumof$aand$bis${a+b}") } funmain(args:Array){ printSum(-1,8) }
Unit返回类型的函数返回类型可以省略
funprintSum(a:Int,b:Int){ println("sumof$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+=1 println("x=$x") }
注释
像Java和JavaScript一样,Kotlin支持行注释和块注释。 //这是行注释 /*这是 块注释*/
和java不同的是,Kotlin块注释可以嵌套。
使用字符串模板
funmain(args:Array){ vara=1 //使用变量名作为模板: vals1="ais$a" a=2 //使用任意表达式作为模板: vals2="${s1.replace("is","was")},butnowis$a" println(s2) }
使用条件表达式
funmaxOf(a:Int,b:Int):Int{ if(a>b){ returna }else{ returnb } } funmain(args:Array){ println("maxof0and42is${maxOf(0,42)}") }
以if作为表达式
funmaxOf(a:Int,b:Int)=if(a>b)aelseb funmain(args:Array){ println("maxof0and42is${maxOf(0,42)}") }
使用可空变量以及空值检查
可能出现空值时,引用必须明确标记为可空的。
返回NULL如果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'isnotanumber") } } 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("Wrongnumberformatinarg1:'${arg1}'") return } if(y==null){ println("Wrongnumberformatinarg2:'${arg2}'") return } //经过空值检测后,X和Y自动转换为非空值。 println(x*y) } funmain(args:Array){ printProduct("6","7") printProduct("a","7") printProduct("99","b") }
使用类型检查和自动转换
is操作符检查表达式是否为某个类型实例。如果对不可变局部的变量或属性进行特定类型检查了,就不需要明确的类型转换:
fungetStringLength(obj:Any):Int?{ if(objisString){ //obj将会在这个分支被自动转换为String类型 returnobj.length } //obj在种类检查外仍然是Any类型 returnnull } funmain(args:Array){ funprintLength(obj:Any){ println("'$obj'stringlengthis${getStringLength(obj)?:"...err,notastring"}") } 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'stringlengthis${getStringLength(obj)?:"...err,notastring"}") } 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'stringlengthis${getStringLength(obj)?:"...err,isemptyornotastringatall"}") } printLength("Incomprehensibilities") printLength("") printLength(1000) }
使用for循环
funmain(args:Array){ valitems=listOf("apple","banana","kiwi") for(iteminitems){ println(item) } }
又或者这样写
funmain(args:Array){ valitems=listOf("apple","banana","kiwi") for(indexinitems.indices){ println("itemat$indexis${items[index]}") } }
使用while循环
funmain(args:Array){ valitems=listOf("apple","banana","kiwi") varindex=0 while(index 使用when表达式
fundescribe(obj:Any):String= when(obj){ 1->"One" "Hello"->"Greeting" isLong->"Long" !isString->"Notastring" else->"Unknown" } funmain(args:Array){ println(describe(1)) println(describe("Hello")) println(describe(1000L)) println(describe(2)) println(describe("other")) } 使用ranges
检查in操作符检查数值是否在某个范围内:
funmain(args:Array){ valx=10 valy=9 if(xin1..y+1){ println("fitsinrange") } } 检查一个数值是否超出范围
funmain(args:Array){ vallist=listOf("a","b","c") if(-1!in0..list.lastIndex){ println("-1isoutofrange") } if(list.size!inlist.indices){ println("listsizeisoutofvalidlistindicesrangetoo") } } 在范围内范围迭代:
for(xin1..5){ print(x) }或者使用步进:
for(xin1..10step2){ print(x) } for(xin9downTo0step3){ print(x) }使用集合
对一个集合进行迭代:
for(iteminitems){ println(item) }使用in操作符检查集合中是否包含某个对象
when{ "orange"initems->println("juicy") "apple"initems->println("appleisfinetoo") }使用lambda表达式筛选和映射集合
fruits .filter{it.startsWith("a")} .sortedBy{it} .map{it.toUpperCase()} .forEach{println(it)}难以理解的小伙伴可以到kotlin官网运行一下代码,结合本文自行理解。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!