kotlin
的函数定义和调用又怎样的区别。
在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
从上面的例子可以看出参数的默认值是在被调用的地方,而不是调用的地方。
在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()
和函数一样,属性也可以放到文件的顶层。顶层属性与其他任意属性一样,是通过访问器来使用的(如果是val
就只有一个getter
,如果是var
就对应一对 getter
和setter
)。
// 与其他属性一样
var count = 0
// 只能获取不能改变值
val name = "Tom"
// 等同于Java的 public static final String API_URL= "http://xxx.com"
const val API_URL= "http://xxx.com"
扩展函数就是一个定义在类外面的成员函数。比如我们添加一个方法,来获取一个字符串的最后一个字符:
// 获取字符串的最后一个字符
fun String.lastChar(): Char = this.get(this.length - 1)
println("${"i am Tom".lastChar()}")
>System.out: m
上面的扩展函数中String
是接收者类型,方法体中的this
是接收者对象。
从某种意义上讲,你已经为String
类添加了一个自己的方法。
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
的实现。
首先我们来看下面一段常见的代码:
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
函数相关的学习,有什么不足的地方,在以后的学习中自勉吧。。。搬砖去