函数参数默认值

1
2
3
fun printParams(num: Int, str: String = "hello") {
println("num is $num , str is $str")
}

我们为第二个参数设定了一个默认值,这样即使我们不传第二个参数,也会有默认值。但如果我们设定的默认值在前面,仍不传的话就会报错。比如:

1
2
3
fun printParams(str: String = "hello", num: Int) {
println("num is $num , str is $str")
}

但是Kotlin支持键值对的形式传参,就很好的避免了上述问题:

1
printParams(num = 100)

扩展函数

语法结构

1
2
3
fun ClassName.methodName(paran1: Int, param2: Int): Int {
return 0
}

用法

比如我们想为String类加一个.lettersCount功能,用于统计字符串中的字母数量。我们可以新建一个String.kt文件用于分类。然后写以下代码:

1
2
3
4
5
6
7
8
9
fun String.lettersCount(): Int {
var count = 0
for(char in this) {
if(char.isLetter()) {
count++
}
}
return count
}

我们就将lettersCount定义为了String的扩展函数,并拥有了String实例的上下文。然后我们使用时只需要:

1
val count = "ABC123xyz!@#".lettersCount()

这样就可以让API变得十分简洁,像字符串自带了这样一个方法一样。

高阶函数应用

可以用来简化SharedPreference的用法,我们提交数据的例子如下:

1
2
3
4
5
val editor = getSharedPreference("data", Context.MODE_PRIVATE).edit()
editor.putString("name", "Tom")
editor.putInt("age", 20)
editor.putBoolean("married", false)
editor.apply()

我们可以用高阶函数来进行一定程度上的简化,新建一个SharedPreferences.kt:

1
2
3
4
5
fun SharedPreferences.open(block: SharedPreferences.Editor.() -> Unit) {
val editor = edit()
editor.block()
editor.apply()
}

我们先添加了SharedPreferences的一个open扩展函数,其中接受一个函数类型的参数,其中open函数接收的是SharedPreferences.Editor的函数类型参数,这里就需要调用editor.block()进行调用。然后我们储存数据时就可以更简单了:

1
2
3
4
5
getSharedPreference("data", Context.MODE_PRIVATE).open {
putString("name", "Tom")
putInt("age", 20)
putBoolean("married", false)
}

这个lambda表达式是有SharedPreferences.Editor的上下文的,可以直接提交。

然后在Google的KTX库中已经支持了上述简化用法:

1
2
3
4
5
getSharedPreference("data", Context.MODE_PRIVATE).edit {
putString("name", "Tom")
putInt("age", 20)
putBoolean("married", false)
}