第三部分:Kotlin函数的定义和调用
前言:为了让介绍更简单直白,我将把Kotlin集合、字符串和正则表达式作为重点问题领域
目录
一、Kotlin中集合的创建:
在kotli.collections包中包含List(有序集合)、Set(无序集合)、Map(健值对)三种集合:
- Collection<T> 是集合层次结构的根。此接口表示一个只读集合的共同行为:检索大小、检测是否为 成员等等。Collection 继承自 Iterable <T> 接口,它定义了迭代元素的操作。可以使用Collection 作为适用于不同集合类型的函数的参数。对于更具体的情况,请使用 Collection 的 继承者:List 与 Set。
- MutableCollection 是一个具有写操作的 Collection 接口,例如 add 以及 remove 。
- Map<K, V> 不是 Collection 接口的继承者;但是它也是 Kotlin 的一种集合类型。Map 存储 键-值 对(或条目);键是唯一的,但是不同的键可以与相同的值配对。Map 接口提供特定的函数进行通过键访 问值、搜索键和值等操作。
- MutableMap 是一个具有写操作的 Map 接口,可以使用该接口添加一个新的键值对或更新给定键的值。
二、顶层函数和属性:
Kotlin中方法属性不需要依附于具体的某一个类,所以声明的顶层函数和属性类似于Java中的静态函数和属性,直接通过类名.的方式调用。如果要修改顶层类名使用@file:JvmName()来指定类名。
三、扩展函数和属性:
fun String.lastChar():Char = this.get(this.length-1)
println("Kotlin".lastChar())
其中String称为“接收者类型”,this称为“接收者对象”。如果在java中调用该函数:
char c = StringUtilKt.lastChar("Java");//括号中传入接收者对象
注意:扩展函数没有多态,因为扩展函数并不是类的一部分,他在类的外面
open class Father
class Child : Father()
fun Father.method() = println("Father")
fun Child.method() = println("Child")
fun main(args: Array<String>) {
val father:Father = Child()
father.method()
}
//结果:Father
四、可变参数、中缀调用:
- 可变参数使用vararg关键字来声明
- 中缀表达式用infix关键字来声明
- 解构声明
五、正则表达式:
""" """三重引号中,不需要对任何符号进行转义操作。
六、局部函数:
class User(val id:Int,val name:String,val addr:String)
fun User.validateBeforeSave(){
fun validate(value: String,fieldName:String){
if (value.isEmpty()){
println("不能保存user $id")
}
}
validate(name,"name")
validate(addr,"addr")
}
fun saveUser(user: User){
user.validateBeforeSave()
//TODO SOMETHING
}
总结:
- Kotlin没有定义自己的集合类,而是在Java的基础上,提供丰富的API操作集合
- Kotlin可以给函数定义默认值,这样大大降低了重载函数的必要性,而且命名参数让函数调用时更加易读
- Kotlin允许许多灵活的代码解构,函数和属性都可以直接在文件中声明,不需要依附于类
- Kotlin扩展函数和属性来扩展任何类的API
- 局部函数帮助你让代码变得更加简洁的同时,避免重复