Kotlin学习笔记(四)—— 函数

2019-12-05  本文已影响0人  CoderCyl
函数的定义

定义一个函数由关键词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
上一篇下一篇

猜你喜欢

热点阅读