kotlin学习
hello world
新建一个kt文件,
fun main(args:Array<String>) {
println("Hello world!");
}
程序主入口main方法, 无需新建类即可运行,函数声明用fun
fun sum(a:Int, b:Int):Int{
return a + b;
}
返回值写在参数之后
表达式可以作为函数体,返回值类型自动推断
fun sun(a:Int, b:Int) = a+b;
返回无意义的值用Unit表示
fun test():Unit {
println("test");
}
变量赋值
变量赋值声明关键字:var、val
var:声明变量
val:声明常量
var i:Int = 1;
val PI:Double = 3.14;
当声明并赋值时,数据类型可以省略, 会自动推断数据类型
var i = 1;
val PI = 3.14
当声明但不赋值时,不能省略数据类型
var i:Int;
val PI:Double;
字符串模板
var s = "aaaaa";
var b = "str = $s";
var c = "${b.replace("str", "who")}"
条件表达式
fun testIf(a:Int, b:Int):Int {
if(a > b) return a;
return b;
}
在kotlin中,if还可以用作表达式
fun max(a:Int, b:Int) = if(a > b) a else b
空值与null检测
当某个值可以为空时,需要在类型后添加?表示可以为空
此时,声明时不能省略类型
var obj:Objects ? = null;
// 表示返回值可以为null
fun parseInt(str:String):Int?{
...
}
类型检测与自动类型转换
is:判断数据是否是某个类型。如果一个不可变的局部变量已经被判断为某个类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 如果走到了这里,说明判断出obj时String,虽然方法参数里obj声明的是any,但是此时已经不需要显式的将obj转为String
return obj.length
}
// 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
return null
}
** 强调为不可变是因为如果可变,那可能会变成其他类型,那就不适用了 **
for循环
var items = listof("apple", "banana", ""kiwifruit);
// 根据元素遍历
for (item in items) {
println(item);
}
// 根据下标便利
for (item in items.indices) {
println(items[item]);
}
while 循环
var index = 0;
while (index < items.size) {
println(items[index]);
index ++;
}
when表达式
private fun testWhen(s: Any?) {
when(s) {
"a" -> 1;
"b" -> 2;
is String -> 3;
1 -> "n";
2 -> {
println("222");
};
else -> "else";
}
}
有点类似java中的 switch
区间 range
var x = 6;
var y = 9;
if(x in 0..y) {
println("x in 0 - y");
}
注意:区间只用于数字
集合
集合的迭代可以用的上面的 for in 循环
var items = listof("a", "b", "c");
for(item in items) {
println(item);
}
判断集合中是否包含某元素 用while in || when
while ("a" in items) {
println("items include a");
}
when {
"a" in items -> println("aaa");
"d" in items -> println("ddd);
}
用lambda来过滤和映射集合 ,与java8 lambda stream大致
items.filter{ it.indexOf("a") >= 0 }
.sortBy{ it }
.map{ it.toUpperCase() }
.forEach{ println(it) }