函数定义和调用
在kotlin中创建集合
val set = setOf(1,7,53)//set集合->HashSet
val list = listOf(1,7,53)//list链表->ArrayList
val map = mapOf(1 to "one" , 7 to "seven" , 53 to "fifty-three")//map键值对集合->HashMap
有名字的参数和默认参数值
fun get(a : Int , b : String , c : Char){
println("$a + $b + $c")
}
以上是一个很基本的函数声明,接着在调用的时候
get(1,"hello",'c')//最基本的调用
get(a = 2, b = "hello" , c = 'c')//利用参数名传递参数
但是这样显的代码更加臃肿,所以要配合默认值使用(这里和一些语言特性很像)
fun get(a : int = 1 , b : String = "hello" , c : Char = 'c')//这样就有了默认值
get(b = "World")//利用参数名实现调用,剩下的参数就是用默认值
get(2)//a被赋值为2,其他使用默认值
get(2,"yes")//a、b均被赋值,c依旧使用默认值
总结:当使用常规调用语法时,只可以忽略后面的参数;当使用命名参数时,可以根据指定名字来赋值
当在Java中调用kotlin的这类函数时,由于Java不存在默认参数值这种说法,所以需要添加@JvmOverloads注解,此时编译器会以从最后一个参数开始逐个忽略每一个参数的方式产生重载的Java函数
顶层函数
对于Java中通过创建静态方法的方式来共享某个函数,kotlin中直接在文件中写函数即可,可以通过@JvmName注解指定类名,从而在Java中调用时使用该注解指定的名字,否则就使用文件名作为类名进行调用(kotlin编译器产生的类的名字跟包含函数的文件的名字一样,文件中所有的顶层函数都被编译成这个类的静态方法)
扩展函数和属性
它是一个可以作为一个类成员进行调用的函数,但是定义在该类的外面
fun String.lastChar() : Char = this.get(this.length - 1)
//类名叫做接收器类型,调用的扩展函数的值叫做接收器对象(该类型的实例)
<注意>扩展函数并不能访问私有或保护属性的类成员
当定义扩展函数后,需要import引入后才可以使用,也可以使用as重命名
//以下三种都可以导入该函数
import string.lastChar
import string.*
import string.lastChar as last
扩展函数不能被子类覆盖,因为扩展函数是依赖于已被声明的静态类型
如果类中有一个成员函数和扩展函数有相同的签名,成员函数总是优先的
使用集合:vararg、infix调用和库支持
可变参数的使用
fun listOf<T> (vararg values : T) : List<T>{...}
但是kotlin要求传递数组类参数时需要显式的对数组进行拆箱操作
fun main(args : Array<String>){
var list = listOf("args:" , *args)//*称作展开操作符
println(list)
}
中缀调用
val map = mapOf(1 to "one")//to不是内置的语法而是一个方法的特殊调用
1.to("one")//常规调用
1 to "one"//使用中缀标记来调用函数
中缀调用可以用于带一个参数的常规方法和扩展函数
为了使得函数可以使用中缀标记来调用,需要使用infix来修饰
infix fun Any.to(other : Any) = Pair(this,other)//to函数的返回类型是一个Pair类型
解构声明
val (number,name) = 1 to "one"
这个特性就叫做解构声明,通过to生成Pair元组并使用解构声明拆箱
使用字符串和正则表达式
通过toRegex()方法显式的创建一个正则表达式
通过三引号包含的字符串不需要转义任何字符,即""“正则表达式”""(\也不需要转义)
本地函数和扩展
本地函数:函数内部声明的函数
本地函数可以访问嵌套函数的所有参数和变量,这样可以避免传递额外的参数
class User(val id : Int, val name : String, val address : String)
fun saveUser(user : User){
fun validate(value : String , fieldName : String){
if(value.isEmpty())
......
}
validate(user.name , "Name")
validate(user.id , "Id")
}
代码也可以抽出放到扩展函数中