Kotlin学习-函数的定义和调用(2)

文章目录

        • 1. 函数默认参数值
        • 2. 顶层函数和属性
          • 2.1 顶层函数
          • 2.2 顶层属性
        • 3. 扩展函数和属性
          • 3.1 扩展函数
          • 3.2 扩展属性
        • 4. 局部函数

上篇我们学习了 Kotlin 学习-基础语法(1)
现在来看下 kotlin的函数定义和调用又怎样的区别。

1. 函数默认参数值

Java中普遍存在的一个问题就是,一些类的重载函数太多,尤其是参数多的时候。
而在kotlin中可以在声明函数的时候指定默认参数值,这样可以避免创建重载的函数。
如下面的例子:

fun getString(a: String, b: String = "", c: String = ""): String {
    val result = StringBuilder()
    result.append(a)
    result.append(b)
    result.append(c)
    return result.toString()
}
println("${getString("Tom")}")
println("${getString("Tom", "Jay")}")
println("${getString("Tom", "Jay", "Curry")}")

>System.out: Tom
>System.out: TomJay
>System.out: TomJayCurry

从上面的例子可以看出参数的默认值是在被调用的地方,而不是调用的地方。

2. 顶层函数和属性

2.1 顶层函数

java中我们少不了要写各种各样的工具类,而在kotlin中不需要创建这些类。把这些函数直接放到代码文件的顶层,不用属于任何类。
例如,我们创建一个名为 test.kt的文件,其中代码如下:

package com.yao.kotlinsimple

fun testTopMethod() {
    println("this is testTopMethod")
}
// 在其他类中直接调用
testTopMethod()
>System.out: this is testTopMethod

由上面的顶层函数可看出,它的作用类似于java类的静态方法。与下面的java代码作用一样。

public class TestKt {
	public static void testTopMethod() {
		....
	}
}
// 在其它类中调用
TestKt.testTopMethod()
2.2 顶层属性

和函数一样,属性也可以放到文件的顶层。顶层属性与其他任意属性一样,是通过访问器来使用的(如果是val 就只有一个getter,如果是var 就对应一对 gettersetter)。

// 与其他属性一样
var count = 0 
// 只能获取不能改变值
val name = "Tom"
// 等同于Java的 public static final String API_URL= "http://xxx.com"
const val API_URL= "http://xxx.com"

3. 扩展函数和属性

3.1 扩展函数

扩展函数就是一个定义在类外面的成员函数。比如我们添加一个方法,来获取一个字符串的最后一个字符:

// 获取字符串的最后一个字符
fun String.lastChar(): Char = this.get(this.length - 1)

println("${"i am Tom".lastChar()}")
>System.out: m

上面的扩展函数中String是接收者类型,方法体中的this是接收者对象。
从某种意义上讲,你已经为String类添加了一个自己的方法。

3.2 扩展属性

kotlin还支持扩展属性,我们把上面的函数转成属性来试下:

// 定义扩展属性,并设置setter和getter方法
var StringBuilder.lastChar: Char
get() = get(length - 1)
set(value) = this.setCharAt(length - 1, value)

>>>println("i am a person?".lastChar())
>?
>>>val ab = StringBuilder("kotlin?")
>>>ab.lastChar = '!'
>>>println(ab)
>kotlin!

可以看到,扩展属性也和接收者的普通成员属性一样。
这里必须定义getter函数,因为没有支持字段,没有默认getter的实现。

4. 局部函数

首先我们来看下面一段常见的代码:

fun requestLogin(account: String, pwd: String) {
    if (account.isEmpty()) {
        throw IllegalArgumentException("empty account")
    }
    if (pwd.isEmpty()) {
        throw IllegalArgumentException("empty pwd")
    }
    login()
}

上面的代码经常会遇到,而且参数多的时候会出现大量的判断,代码抽取后不在一块的话也会非常难理解。
kotlin的局部函数是怎样实现的呢?来看下。

fun requestLogin(account: String, pwd: String) {
    fun validate(value: String, fieldName: String) {
        if (value.isEmpty()) {
            throw IllegalArgumentException("empty $fieldName")
        }
    }
    validate(account, "account")
    validate(pwd, "pwd")
    login()
}

上面这样看起来就好多了,即避免了重复代码,又保证了代码的阅读性。
并且局部函数可以访问外层函数的参数,可以更加的简洁方便。

以上就是kotlin函数相关的学习,有什么不足的地方,在以后的学习中自勉吧。。。搬砖去

你可能感兴趣的:(kotlin,kotlin,kotlin学习,kotlin函数,kotlin和java)