函数的定义和使用
定义
fun sum(a:Int,b:Int):Int{
return a+b
}
sum为函数名称 括号内为形参 :Int 为返回值类型
上述代码可简写为
fun sum(a:Int,b:Int):Int = a+b
还可以写成
var i = {a:Int,b:Int -> a+b}
var sum =i(2,3)
println(sum)
可变参数的函数 vararg
vararg所修饰的变量可以接受无限多个参数,具体如下。
fun sum(vararg x:Int):Int{
var total=0
for(i in x)
total+=i
return total
}
上述代码描写的是多个参数的和。调用如下
val n = sum(1,2,3,8,4,5,1)
println(n)
顶层函数(内容参考自)
原来在Java中,类处于顶层,类包含属性和方法,在Kotlin中,函数站在了类的位置,我们可以直接把函数放在代码文件的顶层,让它不从属于任何类。就像下面这样,我们在一个Str.kt文件中写入如下的Kotlin代码
package util
fun joinToStr(collection: Collection<String>): String{
//....
return "";
}
请注意,我们把它放在了util包中,这在我们厚密啊调用这个类时非常重要。
让我们现来看看在另一个Kotlin类中怎么调用。
import util.joinToStr
fun main(args: Array<String>){
joinToStr(collection = listOf("abc", "ok"))
}
我们可以通过import 包名.函数名来导入我们将要使用的函数,然后就可以直接使用了。
顶层函数属性(内容参考自)
了解了顶层函数,下面再看看顶层属性。顶层属性也就是把属性直接放在文件顶层,不依附于类。我们可以在顶层定义的属性包括var变量和val常量,就像下面这样。
package config
var count = 0
val REQUEST_URL = "http://localhost:8080/"
const val BASE_URL = "http://www.xxx.top/"
使用
import config.count
fun main(args: Array<String>){
//使用var变量
count++
//使用val常量
config.REQUEST_URL
//使用const val常量
config.BASE_URL
}
函数的默认参数
在定义函数的时候所需要传入的参数比较多,而有时候有用不到这么多参数,或者使用者忘记填或少填。那么久需要为参数定义默认的参数。
fun selectMan(name:String="张三",sex:String="男",age:Int=20){
...
}
默认参数也可以用到够早参数中,从而避免产生更多的二次构造函数
class User(val name:String,val isVip:Boolean,credits:Int){
constructor(name:String):this(name,false,0)
constructor(name:String,isVip:Boolean):this(name,isVip,0)
}
可改写成
class User(val name:String,val Vip:Boolean=false,credits:Int=0)
扩展函数
对现有的类进行改进,加入新的函数。以Int为例,在Int类中加入一个求平方的方法。
fun Int.square()=this*this
//使用
val a=8
println(a.square())
println(8.square())
注意 函数扩展不能重载类或者接口中已经定义的函数。
因为,编译器会首先去接受这类型的所有父类和接口中去查找有没有相同的成员函数如果有则使用。
起作用范围与普通函数一样
infix 中缀函数
中缀函数跟赋值操作类似,不同的是名称可以是任意的。例如:
val train = "北京" to "上海"
//tarin 被变成了一个二元数组
//调用
println("$train ${train.first}")
//结果
(北京, 上海) 北京
自定义中缀函数,使用infix关键字加载fun之前,而且只有一个参数:
infix fun String.到(other:String):String{
return this+other
}
//调用
val train = "北京" 到 "上海"
函数字面量
有待更新。。。工作之后一直用的java,后期抽时间补充吧