函数(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表达式使用实例:
定义 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))
- }
- 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"
- }
- }