Kotlin学习笔记之 1
1.基础语法
-
方法描述
fun methodName(type1 : Type, type2 : Type2) : returnType{} fun methodName(type1 : Type, type2 : Type2) : Unit { type1 = type2 }
-
变长参数 vararg
fun methodName(vararg v : Int){ //此处v是个数组 for(nv in v){ print(v) } }
类似于 java中的 ...
//主函数 数组类型的 fun main(args : Array<String>){ }
-
lambda 匿名函数
fun main(args : Array<String>){ //(传参类型1, 传参类型2) -> 返回类型 = { 具体参数1, 具体参数2 -> 返回参数} val plus : (Int, Int) -> Int = { x,y -> x+y} println(plus(1,2)) }
-
var 可变 val 不可变
有一个非常有意思的现象,kotlin自带属性判断功能,即你不指定具体的数据类型,kotlin可以帮你分析出你想要什么。比如说:
//i被判断成Int var i = 123 //s被判断成String val s = "123"
-
String 字符串中直接引入参数和方法
//$符号之后跟{}表示方法,跟参数名表示引用参数 val s = "${a.replace("ss", "ww")}, and then it is $a"
想要直接的去使用字符
$
,我们一般也是借助$
去实现,因为$
没有相应的转义符val s = "${`$`}, is this"
-
关于空
//这边我们可以直接把String? 看成是一种类型,解释为可以为空的String类型 //可能会有疑问既然s已经被val描述,是final类型的了,还会出现可能为空的String //因为虽然你不能再对s赋值了, 但是你依然可以改变非赋值的方式改变它,比如replace什么的等等 val s : String? = "23" //一旦s为空就报错 val a = s!!.toInt() //一旦s为空,可以继续执行不报错,并且此处的b为null var b = s?.toInt() //b为null之后,我们紧接着调用b的其他的方法,产生的也是null,并且不会报错,这就是强大的kotlin容错机制 var c = b.toString() //? 和 ?: 的判断表示如果为空的话,那么就返回后面的内容 //此处的有需要多说一句,一旦为空的情况,那么后面想给什么就给什么,无论字符串还是整型等等,kotlin均可以自动识别,跟你前面想要的类型没有关系 var d = b?.toString() ?: "123" //此处需要注意,一旦是有可能出现为空的类型,kotlin就会在适当的时候通知到你 var h = s?.toInt() var i = 1 //此时由于h很有可能为空,因此kotlin会提示你不允许直接使用*操作符,而是要使用times方法进行?操作 var j = h * j //即如下这样,times方法在kotlin中被用来做乘法的使用 var j = h?.times(j)
-
类型检测
kotlin 中使用 is 来代替使用 isinstanceOf
kotlin 中不存在Object类,通常这个方法可以传入任何数据类型,kotlin直接使用 Any
fun getLength(s : Any){ if(s is String){ println(s.length) } }
-
范围
java中使用的是
for(int i = 0; i < n; i++)
kotlin中比较方便,直接使用
for(i in 1..n)
..针对任何可以进行比较的数据类型,比如
for(c in '0'..'9')
,正对整形有单独优化,一般使用比较多的就是整型,并且对顺序有要求,只能从小到大for(i in 4..1)
不会进到for循环来,因为4无法走到1针对从高到低的情况,要使用到downTo
for(i in 4 downTo 1)
for(i in 1..4 step 2)
====for(int i = 1; i <= 4; i = i + 2)
最终出来的是1,3..和downTo都是包含边界数字的闭集[],如[1,4],如果想要开集,需要使用到until描述符
for(i in 1 until 10)
====== [1, 10) 但是由于局限性,until也只能用在从小到大的并且只能做右边的开集,能用until
,就尽量不去使用1..n-1
范围既可以用在for循环中也能用在if条件判断中
比如
if (i in 1..4)
1 <= i <= 4if(c in '0'..'9')
'0' <= c <= '9'补充(1) 范围之外直接使用 !in
if(i !in 1..4)
即 i 不在 1~4之间
补充(2) 结合when来判断,数组中是否存在某元素
when{ "a" in items -> {} "b" in items -> {} }
-
with
kotlin中我们可以借助with来进行连续调用方法
class Turtle { fun penDown() fun penUp() fun turn(degrees: Double) fun forward(pixels: Double) } val myTurtle = Turtle() with(myTurtle) { // 画一个 100 像素的正方形 penDown() for(i in 1..4) { forward(100.0) turn(90.0) } penUp() }
-
java7 try with resources
java7中的特性,只要是实现了closeable的在使用完成之后需要释放资源的类,会在
try
代码体执行完成之后释放掉资源,在kotlin中我们一般使用use
方法,规定为只要实现了closeable
接口的都有这个方法,意思为use
了之后就会释放自己的资源//java7 try(BufferedReader br = new BufferedReader(new FileReader(path))){ return br.readLine(); } //kotlin var bufferedReader = BufferedReader(FileReader("path")) bufferedReader.use { print(it.readLine()) }
-
注释习惯使用[]而非@param @return
除非需要做特长的单独性说明,一般我们直接使用
[]
/** * Returns the absolute value of the given [number]. */ fun abs(number: Int) = ……
-
能用val不用var,一般用最基本不可变集合
val
和var
不做过多解释了,此处的不可变集合指的是Set``List``Map
,优先使用这些,而不是优先使用HashSet``ArrayList``HashMap
-
条件语句优先级
二元首选if,其次再用when
-
循环语句优先级
优先使用高阶函数,
filter``map
这种,需要单独处理的我们用for
,除非在链式中调用 -
能属性不用函数
底层算法会优先使用属性,而不是函数。所以如果是没有参数的方法,可以直接用属性替代。
-
强转操作符 as
java中的强转是在对象前加上括号类型的方式,kotlin中是通过
as
进行强转的。一般我们为了避免出现
castException
或者空指针的情况,直接使用?as
来进行强转。