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官网运行一下代码,结合本文自行理解。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!