1 函数
函数定义
1 函数基本定义
fun + 函数名 +(参数名:参数类型):返回值类型
fun sum(a:Int,b:Int):Int{
return a+b
}
2 函数表达式
对于非public类型的函数表达式,可以省略返回值类型,自动推断,也可以不省略
fun sum(a:Int,b:Int) = a+b
fun sum(a:Int,b:Int):Int= a+b
对于public类型的,不能省略返回值类型
public fun sum(a:Int,b:Int):Int= a+b
3 没有返回值的函数
对于没有返回值得函数,可以把返回值类型设为Unit,相当于void,也可以省略。无论是否为public修饰的函数都可以省略。
fun show(a:Int):Unit{
Log.i("show",a.toString());
}
fun show(a:Int){
Log.i("show",a.toString())
}
public fun show(a:Int){
Log.i("show",a.toString())
}
可变长参数函数
对于可变长的函数参数,用vararg标识
fun show(vararg v:Int){
for(vt in v){
Log.i("show",vt.toString())
}
}
匿名函数
这里指的就是Kotlin中lambda表达式的使用,其实也可以建立理解为另一种函数的定义方式。
val sum = {a:Int,b:Int -> a+b}
上面是第一种写法,整体写在大括号中,左边是变量,右边是返回值
val sum1:(a:Int,b:Int) -> Int = {a,b -> a+b}
上面是第二种写法,实现功能是和第一种一样的。
首先看-> 左边,sum是函数名,(a:Int,b:Int) -> Int 是它的类型,表示输入两个int型数据,返回一个int型数据。
再看-> 右边,写在大括号里,表示传入是什么,输出结果是什么。
使用:
sum(10,10)
2 常量和变量
变量
var 变量名:类型 = 变量值
var a:Int = 1
常量
相当于final
val 常量名:类型 = 常量值
val a:Int = 1
tips
1 声明时可以不用赋值,但是使用之前必须要赋值,否则编译不过
2 声明时可以不指定类型,自动判断,但是这种情况下必须要赋值
var a = 1
var a:int
a = 1
3 字符串模板
$varName 表示变量值
${varName.fun()} 表示方法返回值:
var a = 1
var s1 = "the value is $a"
var s2 = ${s1.replace("is","was")}
s1:the value is 1
s2:the value was 1
如果想直接使用$,需要这样写${'$'}
val price = "${'$'}9.99"
println(price) // 求值结果为 $9.99
4 NULL检查机制
因为空指针异常很容易发生,而且只能在运行时才能被发现,所有有些隐藏的错误很难被发现。
Kotlin中改进了这一点,引入了空指针异常判断,在编译时,自动检测是否有对象存在空指针异常,如果发现有空指针,会直接在编译时报错。
1 可空对象和不可空对象
在对象的类型后面加上? 表示这个对象是一个可空对象。
不加? 表示是一个不可空对象。
//可空对象
var strA:String? = null
//不可空对象
var strB:String = ""
对于不可空的对象,kotlin不会进行空指针检查,可以想一下,程序员把一个对象设成不可空对象,肯定会知道去给这个对象赋值,就不用麻烦kotlin去干了。
对于可空的对象,kotlin会进行空指针检查,因为可能在某一个可能发生空指针异常的地方忘记了做判断,这种情况还是很多的。
2 三个空指针相关的特殊符号
每次判断空指针的时候都要用if去判断,当需要判断空指针的地方很多时,就会导致代码很难看,严重降低可读性。所以kotlin中提供了三个符号来进行简化。
分别为
? ?: !!
第一个 ?
直接看代码
var str:String? = null
var len:Int?
len = str?.length
这里str是可空对象,len是可空的,?的意思就是如果str不空,返回str的长度,如果str空,返回null,
需要注意,赋值给的对象也要是可空的对象,比如这个len,不然会类型不匹配。
上面的代码作用就等价于下面这个
len = if(str==null) null else str.length
第二个 ?:
它的作用就是如果前面的内容为空,就返回:后面的内容。
接着上面的例子来
var str:String? = null
var len:Int
len = str?.length?:-1
可以看到,现在len我设置成不可空的,但是没有报错。
因为如果str为null,str?.length也会返回null,而后面?:的作用就是如果他前面的内容,也就是str?.length的返回值,如果为null,那么就直接返回:后面的内容,也就是-1。
如果str不为null,那么将会直接返回str的长度。
所有len一定不为空,也就可以不用把它设置为可空的类型了
第三个 !!
它的意思是,让kotlin放弃对可空对象的非空检查。
var str:String? = null
var len:Int?
str = "aaa"
len = str!!.length
看上面的例子,因为已经给str赋值了,所有他不可能为空,所有加上!!,让kotlin在这句代码中,不再对str进行非空检查。
但是,需要注意,只要这样写了,无论str是否为空,kotlin都不会进行非空检查,所以这样写是很有风险的,一定要确保str不为空,才可以这样写。
5 区间
直接看代码
for(i in 1..4) print(i) //输出1,2,3,4
for(i in 4..1) print(i) //没有输出,也就是..只能从小到大用
for(i in 4 downTo 1) print(i) //输出4,3,2,1,
for(i in 1..4 step 2) print(i) //输出1,3
for(i in 4 downTo 1 step 2) print(i) //输出4,2
for(i in 1 until 4) print(i) //输出1,2,3
网友评论