【Kotlin 初学者】函数(方法)(下)

简介: 函数 函数(function)和方法(method)这两个概念经常被混淆,他们到底有什么关联和区别?其实,它俩没有什么区别只是不同语言叫法不一样,在Java中普遍叫方法。而在Kotlin中普遍叫函数。重点是:函数(function)和方法(method)是同一个东西,别搞错了。

拓展


匿名函数


       定义时不取名字的函数,我们称之为匿名函数,匿名函数通常整体传递给其他函数,或者从其他函数返回。有了它,我们能够根据需要制定特殊规则,轻松定制标准库里的内置函数


微信图片_20220524194604.png

{} 就代表匿名函数。


it关键字


      只有一个参数的匿名函数时,可以使用it关键字来表示参数名。当你需要传入两个值参,it关键字就不能用了。这里简单的了解一下,在后面的实践中使用。


函数类型和隐式返回


       函数的类型,由传入的参数和返回值类型决定


       隐式返回:除了极少数情况外,匿名函数不需要return关键字来返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果


实践


fun main() {
    //1、声明函数的输入() 输出String
    val scFun :() -> String
    //2、实现函数
    scFun = {
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 就是个战五渣"
    }
    //此处别忘记加(),这里是函数而不是属性
    println(scFun())
}


微信图片_20220524195542.png


然后你会发现在第一步下面有虚线,咱们操作一下。


微信图片_20220524195603.png


 代码如下,更加简洁了


fun main() {
    //1、声明函数的输入() 输出String
    //2、实现函数
    val scFun :() -> String = {
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 就是个战五渣"
    }
    println(scFun())
}


匿名函数参数


       匿名函数可以不带参数,也可以带一个或多个任何类型的参数。

       需要带参数时参数的类型放在匿名函数的类型定义中参数名放在函数定义中


实践


fun main() {
    //带参数
    val scFun2: (Int) -> String = { age ->
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 就是个战$age 渣"
    }
    println(scFun2(16))
}


微信图片_20220524195731.png


这里是一个参数咱们尝试使用一下it关键字


       it关键字实践


微信图片_20220524195753.png


  看 1 处,还有警告:这里的it代表传入的Int。

       当这里的传入参数变成多个时,it就无法使用了。


类型推断


       定义一个变量时,如果已把匿名函数作为变量赋值给它,就不需要显示指明变量类型。

无参类型推断


实践


1.    //无参类型推断
    val scFun4 = {
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 无参类型推断"
    }
    println(scFun4())


微信图片_20220524195842.png


带参类型推断


       实践


    //带参类型推断
    val scFun5 = { age:Int,money:Float->
        val name = "帅次"
        // 匿名函数不需要写retrun,最后一行就是返回值
        "$name 带参类型推断 $age 岁啦,兜里$money"
    }
    println(scFun5(15,1.25f))


微信图片_20220524195914.png


定义一个函数:参数是函数


       一个函数,作为另一个函数的参数。


       实践


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))
}


微信图片_20220524200009.png


简略写法


       一个函数的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))
}


微信图片_20220524200044.png


函数引用


       要把函数作为参数传给其他函数使用,除了传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))
}

微信图片_20220524200120.png


函数返回类型为匿名函数


fun main() {
    //使用
    val funName = helloSc()
    println(funName(15))
}
//定义具名函数,返回类型为匿名函数
fun helloSc():(Int)->String{
    val name = "渣渣次"
    //返回的匿名函数,age传入的参数
    return {age->
        //匿名函数返回类型
        "$age 岁的$name"
    }
}


微信图片_20220524200152.png


文章知识点与官方知识档案匹配,可进一步学习相关知识

Java技能树控制执行流程函数19533 人正在系统学习中




相关文章
|
20天前
|
安全 Kotlin
Kotlin教程笔记(23) -作用域函数
Kotlin教程笔记(23) -作用域函数
56 6
|
20天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
30 6
|
1月前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
42 13
|
24天前
|
IDE 开发工具 Kotlin
Kotlin教程笔记(6) - 函数与Lambda表达式
Kotlin教程笔记(6) - 函数与Lambda表达式
49 1
|
1月前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
25 1
|
1月前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
|
1月前
|
安全 Kotlin
Kotlin - 作用域函数
Kotlin - 作用域函数
24 0
|
2月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
35 1
|
3月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
105 1
|
4月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
66 4