kotlin学习笔记

准备开始

基本语法

定义包名

在源文件的开头定义包名:

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循环

使用 while 循环

funmain(args:Array) {valitems=listOf("apple","banana","kiwi")varindex=0while(index

参看while循环

使用 when 表达式

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表达式

使用ranges

检查 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) }}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容