您的位置:首页 > 移动开发 > Android开发

Android开发,Kotlin的了解与学习(四)-----基本语法之方法、操作符

2017-06-19 17:30 381 查看
本章主要了解kotlin中基本语法的使用

定义一个方法

方法的定义,在前面几章里面已经提到了一点,这里仔细了解一下

var a: Int = 0
fun getNum(num: Int): Int {
return a
}

fun setNum(num: Int) {
a = num
}
上面的方法相当于下面

int a = 0;
public int getNum(){
return a;
}

public void setNum(int num){
a = num;
}


现在主要来找不同,首先是fun,关于可见性修饰符 public private protect等我们待会再说

来看set方法,kotlin的参数名在数据类型之前,这个之前提到过,这是很容易搞错的一点,从 int num到现在的num:Int

另外就是kotlin中没有分号";"

第二点,就是返回值了,java的返回值在方法名之前,但是kotlin的返回值在之后,并且与方法名中间以冒号隔开

fun getNum(): Int {  }
这里的Int就代表了要返回一个整数类型

第三点,本系列文章第二章提到过,kotlin对于默认的处理办法,如下

fun setNum(num: Int = 3) {
a = num
}
和之前的对比,多了一个 “ = 3”这样的句子,可以理解为默认值

同时我们在使用set方法时

可以这样

setNum(5)
也可以这样

setNum()
即如果我传了参数,就使用参数,没传参数就使用默认的参数,这样的一个方法相当于下面的两个java代码

public void setNum(){
setNum(3);
}

public void setNum(int num){
a = num;
}
对,极大的方便了方法的重载

另外,我提到过kotlin是空指针安全的,所以很明显这里有一个会出空指针的地方,比如没写默认值,还调用空设置

不存在的!



如果没有设置默认值,是不允许这样调用的,必须传入一个值

方法的简写

方法简写也是kotlin的一大特点,不仅仅是方法简写,类似于for if 乃至android的点击事件其实都存在着一部分方法简写,这就是kotlin 能节省代码量的原因,如下

fun sumNum(a:Int, b:Int) = a + b
java的代码我就不一一敲出来了,显而易见kotlin的优势,在这种简单的函数下,可以节约很多的时间,代码也更加的好看

其实普通的方法也进行了简写的,我们知道java中,每个方法都有返回值,所谓的无返回其实是返回了一个void,在kotlin中,其实也有类似于void的返回值,不过在kotlin中被默认省略了,如下

fun setNum(num : Int){

}
fun setNum(num : Int) : Unit{

}
这里的这个Unit就相当于java的void,是一个无类型的返回值

更多的简写在后面的学习中会慢慢的提到

字符串模板

关于字符串模板,在之前其实已经出现过很多次了

最简单的如下

var a = 1
println("a = $a")
可以看到里面出现了$这个标志,这个标志就是kotlin字符串模板的代表了

所谓字符串模板,其实比较类似于sql语句的用法了。在双引号包起来的字符串里引用常量。

这里的$a就是a所对应的值“1”,所以打印出来“a = 1”

复杂一点的就涉及到了公式了,在$标志后面添加一个{ },如下

var a = 1
println("a = ${a++}")
var b = "this is a test"
println("b = ${b.subString(3,7)}")
以上用法,在你只需要简单使用某个参数的值时,可以很方便的使用,不需要先定义一个参数再进行赋值,再使用。很好的避免了代码中参数复杂过多。

可见性修饰符

kotlin中的可见性修饰符和java中其实比较类似

分为public private protected internal

默认为public 可以不写,即public fun ....等同于fun...

不同的是,kotlin多了一个internal这个修饰符

internal代表了在当前模块中使用

即用internal修饰的参数或者方法,只在当前的方法或类中可以使用,相当于public,在其他方法或者类中无法使用,相当于private

类型检查与自动转型

类型检查用到了 is 这个操作符,使用方法如下

fun getText(test : Any){
if (test is String){
test.substring(0)
}
}
首先这个方法中,我们用到了Any

Kotlin中的any很显然相当于java中的object,具体就不再细说

我们来看 is的用法,其实很明显了,这个is 和java的 instanceof是一样一样的,是用来判断类型的,不过kotlin还提供了更加逆天的用法。自动转型。

我们通过if语句进行判断test是否属于String类型,如果是,可以看到,我直接在下面使用了

test.substring(0)


是的,当is语句判断成功后,我们的test已经被kotlin自动转换成了string类型了,可以直接调用针对于String才有的方法substring,同样的,如果我们test is Int成立,我们也可以对test进行Int类型的相关操作。

鼠标放在test上面,会有如下提示Smart cast to kotlin.String,自动转换成String类型

而且最重要的是,我们刚刚说到的,如果成立,也就是说,像下面这种

fun getText(test : Any){
if (test !is String){
test.substring(0)//会报错的
}
}


test !is String,test不属于String类型,代码会自动提示你,不允许这样做,这就从源头上避免了java中非常容易出现的一个exception,ClassCastException

downTo及step

这两个操作符,都是在循环体for里面进行使用的,如下

for (i in 0..10 step 2){
println(i)
}
应该容易看懂,这个step就是一个循环走几步的问题,换算成java可以理解成这样

for(int i = 0; i<=10; i+=2){

}
即,每次循环都走两步,在这种情况下打印出来的就是0 2 4 6 8 10

你可能会觉得其实也没有比java方便多少,但是在下面这种情况就不一样了

for (i in 0..10 step 3){
println(i)
}
前面step等于2,刚好能除尽,所以倒还好,那么当step等于3时,10是除不尽的,如果仍然用java的方法,当i = 9时,循环体加3,i=12,这之后如果用i去取某个集合的值,是会出现数组越界的。

而kotlin中,使用step,当走到9时,如果无法继续加了,是不会继续往12上取的。

打印的值就是0 3 6 9

然后就是downto的用法了,在第二章写for的时候,可能你想到过也尝试过,kotlin的循环没办法倒序,没办法像java一样实行i--这样的操作,i in 0..5也被办法写成i in 5..0,。

你可能会想到时候要用还需要先在外面建立一个倒序的集合再使用(事实上我之前也是这么想的,不然我也暂时想不到5..0这样的操作)

但是其实,kotlin已经考虑到了这个,并提供了downTo这个操作符。

for (i in 5 downTo 2){
println(i)
}


如上,进行的就是从5到2的倒序循环

PS:其实我仍然觉得5..2这样的操作更加深得我心

“三目运算符”

之所以这里的三目运算符我打了引号

因为kotlin中其实没有三目运算符这个东西,这里提到的三目运算时,指代的是?: 这个操作符

使用方法如下:

var a : String? = null
val b = a ?: 0
println(b)
可以看到,我们先定义了一个null的参数a,再使用了b = a ?: 0这样的语句

代表了如果a等于空,b就等于0,如果不等于空,b就等于a

是不是和java的三目运算符很相似,不过需要注意的是?:只能判断左边的参数是不是为null,如果是null才会返回右边的值,否则都是左边的值。

所以其实?:可以当做一个为了避免空指针的一个操作。kotlin在空指针安全上想了很多办法。

类型转换符as

as是kotlin提供的用于类型转换的操作符,使用如下

fun testAs(any : Any) : Int{
return any as Int
}
println(testAs(123))
注意,这只是确定是该类型的转换,并不能把String类型的“123”转成成Int类型的123

相应的转换应该像这样

var a = "123"
var b = a.toInt()
println(b)
这个之后再说。继续看as

as这个方法,如果出现了我上面提过的String as Int,是会出错的,ClassCastException,所以kotlin提供了安全的类型转换,as?

var a = "test"
var b = a as? Int
println(b)
如上,使用as?,如果转型失败,此时返回为null,b的值就为nul,所以在使用as的使用,都建议使用as?,因为如果你想通过获取exception来判断不是该类型,来进行别的操作,你完全可以使用 is 这个操作符

Android开发,Kotlin的了解与学习(五)-----基本语法之集合相关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息