Kotlin学习笔记(四)—— 函数
函数的定义
定义一个函数由关键词fun、函数名、参数列表,返回值类型和函数体组成。fun是function的意思;函数名可以是任何符合命名规范的词;参数列表由0个或多个组成;形参在前,类型在后,用冒号(:)隔开;返回值类型紧接在函数列表括号后面,也是用冒号将函数列表和返回值类型隔开,无返回值默认是返回Unit,也可以省略不写;函数体是返回值类型右边一对大括号之前的代码块。
fun funDemo(a: Int, b: Int): Int {
return a + b
}
或者简写成
fun funDemo(a: Int,b: Int) = a + b
可变长参数
vararg 修饰符可以接收多个参数,和Java中定义可变长参数用...(int...)一样的。
// Java
private int add(int... numbers) {
int sum = 0;
for(int number:bumbers){
sum += number;
}
return sum;
}
>> Log.d("TAG", add(1, 2, 3, 4))
10
// Kotlin
fun add(vararg numbers: Int) {
var sum = 0
for (number in numbers) {
sum += number
}
return sum
}
>> println(add(1, 2, 3, 4))
10
或者
val arr = intArrayOf(1, 2, 3, 4)
>> println(add(*arr))
10
当传入数组时,数组名前面需要加一个星号(*),星号是展开操作符,表示把这个数组全部展开。
成员函数
定义在类、object或者接口内的函数称为成员函数。
class Rect {
fun getArea(width: Int, height: Int): Int {
return width * height
}
}
getArea()就是一个成员函数
本地函数/嵌套函数
本地函数也叫嵌套函数,是指在函数里面声明的函数。嵌套函数的作用域只在其外部函数内,在其外部就失去了作用。
fun printPrice(price: Int, number: Int) {
fun totalPrice(): Int {
return price * number
}
print(totalPrice())
}
以上代码只是一个非常简单的例子。在外部方法中有很多相同的代码也是可以抽取出来封装成嵌套函数。
命名参数和默认参数
当调用一个函数参数很多时,很可能就无法知道参数的具体含义是什么了,可读性就比较差了。好在IDE会很智能的提示各个参数的含义。而且Kotlin也支持显示的将参数名写出来,一旦写了命名参数后,参数的顺序就不重要了。
fun getVolume(length: Int, width: Int, height: Int): Int {
return length * width * height
}
>> getVolume(10, 20 ,30)
>> getVolume(length = 10, width = 20, height = 30)
>> getVolume(width = 20, length = 10, height = 30)
以上三种调用方法完全等价。
但是如果参数 height 默认为 30 呢?难道每次调用都需要再传一次30吗?这感觉很多余。这种情况可以给函数指定默认参数值。
fun getVolume(length: Int, width: Int, height: Int = 30): Int {
return length * width * height
}
>> getVolume(10, 20 ,30)
>> getVolume(10, 20)
>> getVolume(length = 10, width = 20, height = 30)
>> getVolume(width = 20, length = 10, height = 40)
函数操作符
重载操作符必须要用 operator 关键字以及用对应的英文名作为函数名。
操作 | 函数名 |
---|---|
!x | x.not() |
-y | y.unaryMinus() |
+z | z.unaryPlus() |
a..b | a.rangeTo(b) |
c + d | c.plus(d) |
e - f | e.minus(f) |
g * h | g.times(h) |
i/j | i.div(j) |
m%n | m.mod(n) |
in 和 contains
in 用在遍历和判断包含关系时候使用。in 关键字对应的函数名是 contains。
val arr = arrayOf(1, 2, 3, 4)
val a = 1 in arr
val b = arr.contains(1)
>> println(a)
>> println(b)
true
true
set 和 get
set 对应数组设置值,get对应数组取值[]
val arr = arrayOf(1, 2, 3, 4, 5)
>> println(arr[1])
2
>> println(arr.get(1))
2
>> arr[1] = 10
>> println(arr.joinToString())
1, 10, 2, 3, 4, 5
>> arr.set(1, 10)
>> println(arr.joinToString())
1, 10, 2, 3, 4, 5
扩展函数
给已有的类加入新的函数而又不修改原有的类。比如给 Int 类增加一个对一个数求平方加 1 的函数。
fun Int.squarePlusOne(): Int {
return this * this +1
}
>> println(10.squarePlusOne())
101