函数(function)和方法(method)这两个概念经常被混淆,他们到底有什么关联和区别?其实,它俩没有什么区别只是不同语言叫法不一样,在Java中普遍叫方法。而在Kotlin中普遍叫函数。重点是:函数(function)和方法(method)是同一个东西,别搞错了。
函数定义使用关键字 fun,参数格式为:参数 : 类型
fun sum(a:Int ,b:Int ) :Int { // Int 参数,返回值 Int
return a+b
}
表达式作为函数体,返回类型自动推断:
fun sum(a:Int ,b:Int) =a+b
public fun sum(a:Int,b:Int) :Int=a+b // public 方法则必须明确写出返回类型
无返回值的函数Unit(类似Java中的void):
fun printSum(a:Int,b:Int) :Unit{
print(a+b)
}
// 如果是返回 Unit类型,则可以省略(对于public方法也是这样):
fun printSum(a:Int,b:Int){
print(a+b)
}
可变长参数函数
函数的变长参数可以用 vararg 关键字进行标识:
fun vars(vararg v:Int){
for(vt in v){
print(vt)
}
}
//测试
fun main(args:Array<String)){
vars(1,3,4,2,5)
}
- 函数的参数默认值
-
如果不打算传入值参,可以预先给参数指定默认值
-
- 具名函数参数
-
如果使用命名值参,就可以不用管值参的顺序(当参数过多的时候可以使用)
-
fun main() {
println(doUserInfo("ShuaiCi", 18))
//如果使用命名值参,就可以不用管值参的顺序
println(doUserInfo(age = 6, name = "Kotlin"))
//默认参数,可不传age
println(doScUserInfo("Android"))
//可传age
println(doScUserInfo("Java",30))
}
private fun doUserInfo(name: String, age: Int): String {
return "$name 今年已经$age 了哦"
}
//默认参数:预先给age指定默认值15
private fun doScUserInfo(name: String, age: Int = 15): String {
return "$name 今年已经$age 了哦"
}
lambda(匿名函数)
lambda表达式使用实例:
定义 val 方法名:(类型)->返回类型={参数名 ->方法体,最后一句是返回值,}
匿名函数不需要return关键字来返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果。
// 测试
fun main(args: Array<String>) {
val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
println(sumLambda(1,2)) // 输出 3
}
匿名函数参数只有一个 默认it
val lamber4:(Int)->String={
"$it"
}
匿名函数可以不带参数,也可以带一个或多个任何类型的参数。
fun main() {
//1、声明函数的输入() 输出String
//2、实现函数
val scFun :() -> String = {
val name = "帅次"
// 匿名函数不需要写retrun,最后一行就是返回值
"$name 就是个战五渣"
}
}
无参类型推断
实践
//无参类型推断
val scFun4 = {
val name = "帅次"
// 匿名函数不需要写retrun,最后一行就是返回值
"$name 无参类型推断"
}
带参类型推断
//带参类型推断
val scFun5 = { age:Int,money:Float->
val name = "帅次"
// 匿名函数不需要写retrun,最后一行就是返回值
"$name 带参类型推断 $age 岁啦,兜里$money"
}
println(scFun5(15,1.25f))
定义一个函数:参数是函数
一个函数,作为另一个函数的参数。
fun main() {
//2、声明函数
val bookBeginner = {bookName:String,price:Double->
"$bookName 定价为:$price"
}
//3、调用函数,传入函数bookBeginner
learningAndroidBook("帅次",bookBeginner)
}
//1、定义一个函数(learningAndroidBook):参数是函数(bookPrice)
fun learningAndroidBook(name:String,bookPrice:(String,price:Double)->String){
println("$name 来自 learningAndroidBook ")
println(bookPrice(name,48.88))
}
简略写法
一个函数的lambda参数排在最后,或者是唯一的参数,那么括住lambda值参的一对圆括号就可以省略。
fun main() {
//4、简略写法(参数排在最后)
learningAndroidBook("Kotlin 简略写法"){bookName:String,price:Double->
"$bookName 定价为:$price"
}
//5、简略写法(唯一一个参数),()省略了
learningAndroidBook2{bookName:String,price:Double->
"$bookName 定价为:$price"
}
}
//定义一个函数,参数是函数
fun learningAndroidBook2(bookPrice:(String,price:Double)->String){
println(bookPrice("Kotlin 简略写法-唯一一个参数",48.88))
}
函数引用
要把函数作为参数传给其他函数使用,除了传lambda表达式(匿名函数),kotlin还提供了其他方法,传递函数引用,函数引用可以把一个具名函数转换成一个值参,使用lambda表达式的地方,都可以使用函数引用。
fun main() {
//6.2、函数引用
learningAndroidBook("函数引用",::bookPriceName);
}
//6.1 定义具名函数
fun bookPriceName(bookName:String,price:Double):String{
//具名函数这里要加return
return "$bookName 定价为:$price"
}
//1、定义一个函数(learningAndroidBook):参数是函数(bookPrice)
fun learningAndroidBook(name:String,bookPrice:(String,price:Double)->String){
println("$name 来自 learningAndroidBook ")
println(bookPrice(name,48.88))
}
——————
函数返回类型为匿名函数
fun main() {
//使用
val funName = helloSc()
println(funName(15))
}
//定义具名函数,返回类型为匿名函数
fun helloSc():(Int)->String{
val name = "渣渣次"
//返回的匿名函数,age传入的参数
return {age->
//匿名函数返回类型
"$age 岁的$name"
}
}