kotlin-30分钟快速入门
1.定义变量
在kotlin中,通过var 或者 val 来定义,区别就是 val定义的变量只能读不能修改,var则可以修改。
val a:Int = 1 //等价于java: final int i = 10; a = 2 // 错误,变量a是只读 var b:Int = 2 b = 15 // ok
kotlin中定义的变量的格式
[变量名]:[变量类型]
另一方面,kotkin中的整形既不是用int或Integer,而是使用Int,这里简单介绍一下kotlin中的基本类型:数字、字符、Boolean、数组和字符串
kotlin关键字 | 对应java关键字 | 说明 |
---|---|---|
Double | Double | 64位 |
Float | Float | 32位 |
Long | Long | 64位 |
Int | Integer | 32位 |
Short | Short | 16位 |
Byte | Byte | 8位 |
Arrya | Object[] | |
Boolean | Boolean | |
String | String | |
Any | Object | kotlin中使用Any来达到java中Object的作用 |
看来除了Int类型,其他的好像也和java中的差不多。这里只是简单与java中对比介绍一下,后面会专门介绍这些基本类型与java中的异同。
变量类型可以省略
对于在定义的时候同时初始化的变量,可以省略变量类型,kotlin会根据初始化的值进行变量类型推断
val a = 1 // a是Int类型,Long在则在后面加上L,如 10L val b = 1.2 // b是Double类型,Float在后面加上f/F,如1.2f val c = "test" // c是String类型
2.定义方法(function)
fun sum(a: Int, b: Int): Int { return a + b } fun myPrint(a: Int) { print(a) } fun main(args: Array<String>) { print("sum of 3 and 5 is ") println(sum(3, 5)) }
注意的是
- kotlin中任何东西都是对象,包括方法,所以方法的定义和变量类似
[方法定义]:[返回类型]{方法体}
- 如果没有返回,则可以省略返回类型(或者使用Unit)
- 参数传递过来的变量是只读的(val修饰)
fun someCall(a:Int){ a = 2 //error }
3.null检查
在kotlin中,默认定义一个变量是不能为null
var a:Int = null //compile error var a:Int = someCallReturnNull() // runtiem excetion:KotlinNullPointerException
那如果允许空,则需要在变量类型后加上'?'例如
var a:Int? = null
方法的类似,如果定义方法
fun someCall(): Int { return null //compile error }
因为返回的类型为Int,是不允许为空的,如果要返回空怎么办呢,一样加上'?'
fun someCallWillReturnNull(): Int? { return null //ok }
如果我们定义了不能为空的类型,去接受可能返回空的函数怎么办,这个使用要用到另外一个符号'!!'
var a:Int = someCallWillReturnNull() //compile error var b:Int = someCallWillReturnNull()!! //变量也是同理 var c:Int? = null var d:Int = c!! //当然这里肯定会跑出NPE,至少在编译到时候不会报错
其实可以简单理解,使用!!修饰的变量,如果为null就会跑出NPE.例如a!! 可以理解
if(a==null){ throw new NullPointExcetion(); }
空检测是kotlin的一个特点,他规定如果某些方法会返回null则在处理这些返回时需要注意,否则认为是null安全的(即不用检测null)
4.字符串模板
如果要在java中找个对应功能,可能就是String.format(),但是kotlin中的字符串模板更强大一点
var a = 1 // 简单的变量替换 val s1 = "a is $a" a = 2 // 在字符串模板中使用一些字符串方法 val s2 = "${s1.replace("is", "was")}, but now is $a"
5.条件表达式
if表达式
常规的用法和java中类似
fun max(a: Int, b: Int):Int{ var max: Int if (a > b) { max = a } else { max = b } return max }
但是kotlin提供的一些语法糖,例如上面max等于a和b中的最大者,可以这样写
val max =if (a > b) { a} else { b }
注:kotlin总没有 ? : 三元运算符
进一步,如果方法返回a和b中的最大者
fun max(a: Int, b: Int) = if (a > b) {a} else {b}
可见变量和方法其实有很共性的(其实对于kotlin都是对象)
when表达式
取代java中switch,
when(x){ 1 -> someCall1(x) 2,3 -> someCall2(x) else -> someCall3(x) }
6. 类型检查和转换
在java中,我们常常强转一个类型会这么写
if(obj instance MyObj){ MyObj myObj = (MyObj)obj; myObj.someCall() }
是不是感觉很冗余,kotlin抓住了这个痛点
if(obj is MyObj){ obj.someCall() //已经转换位MyObj类型 }
或者也可以这样
if(obj !is MyObj){ //do something } obj.someCall() //已经转换位MyObj类型
7.数字序列
kotlin中提供遍历一组数字序列,例如 1到100 可以表示为 1..100
for (i in 1..100) { ... }
8.集合操作
遍历
for (item in items) { println(item) }
kotlin遍历list或者map十分方便
//遍历list val items = listOf("apple", "banana", "kiwi") for (item in items) { println(item) } //遍历map for ((k, v) in map) { println("$k -> $v") }
检查某个对象是否在集合中
when { "orange" in items -> println("juicy") "apple" in items -> println("apple is fine too") }
使用lambda进行集合操作
这个有点类似java8中的stream
lists .filter { it.startsWith("a") } .sortedBy { it } .map { it.toUpperCase() } .forEach { println(it) }
注:如果lambda的参数一个,可以省略,并且使用it来代替
小结
本人也是刚开始学习kotlin,上面只是对kotlin的一些基础用法进行简要介绍,大多参考官方文档。kotlin的还有很多高阶用法,后面还会继续些文章介绍,一方面可以自己学习kotlin,另一方面可以分享自己所学的东西,和大家一起交流