Kotlin基础知识学习(三)

news2025/1/22 23:56:31

函数使用

基本用法

函数声明变化
  • 如果函数是公开的,则public关键字可以省略。
  • 用fun关键字表示函数的定义。
  • 如果函数没有返回值可以不用声明。
  • 如果函数表示重载,直接在fun同一行用override修饰。
  • 函数参数格式是变量名:变量类型。
  • 函数参数允许空值则在后面加上?。
/**
 * 1、公共方法 public可以省略
 * 2、fun关键字表示函数定义
 * 3、test 方法名
 * 4、返回值在()后面,:Unit没有返回值,可以省略不写
 */
fun test(){
    println("没有入参,没有返回值的函数")
}
fun test():Unit{
    println("没有入参,没有返回值的函数")
}
    //无参函数调用
    test()//没有入参,没有返回值的函数
入参格式
  • 参数格式(变量名:变量类型)
  • 允许变量为空格式(变量名:变量类型?)
/**
 * 1、参数声明格式:变量:变量类型
 * @param name 名字
 * @param price 价格
 */
fun test1(name:String,price:Int){
    println("${name}买了一个${price}元的鸡蛋")
}
    //有参函数调用
    test1("张三",10)//张三买了一个10元的鸡蛋
/**
 * 1、如果参数运行为空在变量类型后面加上?
 * @param name 名字
 * @param price 价格
 */
fun test1(name:String?,price:Int){
    if(name != null){
        println("${name}买了一个${price}元的鸡蛋")
    }
}
返回格式
  • 如果有返回值需要在()后面加上返回值类型,格式(:返回值类型),可以理解成跟变量定义一样。
  • 如果没有返回值可以不用写,默认也会返回一个Unit类型对象。
  • 返回值也是在方法体里用return返回。
/**
 * 1、有返回值需要在()后面加上【:返回值类型】
 * 2、方法体需要通过return 返回对应类型的数据
 * @param name 名字
 * @param price 价格
 */
fun test2(name:String,price:Int):String{
    println("${name}买了一个${price}元的鸡蛋")
    return "${name}买到鸡蛋了"
}
    //有返回值的函数调用
    var str = test2("李四",1)//李四买了一个1元的鸡蛋
    println(str)//李四买到鸡蛋了

入参参数的变化

参数默认值
  • 函数入参参数可以指定默认值
  • 格式(变量名:变量类型 = 默认值)
/**
 * 1、参数可以指定默认值
 * 2、格式:变量类型=默认值
 * @param mountain
 */
fun test(mountain:String,first:String="东岳泰山", second:String="西岳华山", third:String="南岳衡山", fourth:String="北岳恒山",five:String="中岳嵩山"){
    println("${mountain}是$first,$second,$third,$fourth,$five")
}
    //参数指定默认值,调用的时候可以不用再写
    test("中国五岳")//中国五岳是东岳泰山,西岳华山,南岳衡山,北岳恒山,中岳嵩山
    //调用的时候修改默认值,第一个默认参数可以直接修改
    test("中国五岳","泰山")//中国五岳是泰山,西岳华山,南岳衡山,北岳恒山,中岳嵩山
指定参数的默认值
  • 如果在函数调用的时候,只想改某个参数的默认值,可以通过变量名进行指定。
    //如果修改的不是第一个有默认值的参数,需要通过变量名指定
    test("中国五岳", second = "华山")//中国五岳是东岳泰山,华山,南岳衡山,北岳恒山,中岳嵩山
可变参数
  • kotlin中可变参数是用关键字vararg进行修饰。
  • 格式(vararg 变量名:变量类型)。
  • 函数在解析的时候会将可变参数转化成数组,可通过数组形式进行访问。
/**
 * 1、参数可用可变参数,用关键字vararg说明
 * 2、格式:vararg 参数变量名:类型
 * 3、kotlin在解析的时候会把可变参数解析成数组
 * @param mountain
 */
fun test1(mountain:String,vararg strArray:String){
    var str = ""
    for (item in strArray){
        str += "$item "
    }
    println("${mountain}是$str")
}
test1("中国五岳", "东岳泰山","西岳华山","南岳衡山","北岳恒山","中岳嵩山")//中国五岳是东岳泰山 西岳华山 南岳衡山 北岳恒山 中岳嵩山

特殊函数

泛型函数
  • 定义泛型函数时,得在函数名称前面添加“”,表示以T声明的参数(包括输入参数和输出参数),其参数类型必须在函数调用时指定。
  • 调用格式(函数名称<具体类型>)。
/**
 * 泛型函数:<T> T表示泛型
 */
fun <T> test(tag:String,vararg array:T){
    var str:String = "$tag:"
    for (item in array){
        str = "$str${item.toString()} "
    }
    println(str)//中国五岳:东岳泰山 西岳华山 南岳衡山 北岳恒山 中岳嵩山
}
    test<String>("中国五岳","东岳泰山","西岳华山","南岳衡山","北岳恒山","中岳嵩山")
    test<Int>("10以内的偶数",2,4,6,8,10)//10以内的偶数:2 4 6 8 10
内联函数
  • 内联函数在编译的时候被内联展开,即将函数体直接插入到调用该函数的地方。
  • 内联函数主要用于消除函数调用的开销,特别是对于那些小而频繁调用的函数非常有用。
  • 内联函数还可以用于实现一些高级特性,如非局部返回和重尾递归优化。
  • 用关键字inline表示内联函数。
/**
 * 内联函数 用关键字inline
 * 在调用处将函数体直接插入
 */
inline fun <T> setNumber(number: T){
    println(number)
}
    setNumber(1)
    setNumber("张三")
函数简化
  • 函数有返回值定义可以当初特殊的变量,变量可以通过=进行赋值,所以对于函数体是比较简单的可以通过=直接赋值给函数。
fun compare(a:Int,b:Int):Int{
    if(a > b){
        return a
    } else {
        return b
    }
}


/**
 * 函数有返回值定义可以当初特殊的变量,变量可以通过=进行赋值
 * 所以对于函数体是比较简单的可以通过=直接赋值给函数
 */
fun compare1(a:Int,b:Int) = if(a > b) a else b

fun factorial(n:Int):Int {
    if (n <= 1) return n
    else return n*factorial(n-1)
}

fun factorial1(n:Int) = if (n <= 1) n else n*factorial(n-1)
    println(compare1(1,3))//3
    println(factorial1(3))//6
尾递归函数
  • 尾递归(Tail Recursion)是一种递归形式,其中递归调用是函数执行的最后一步。
  • 通过关键字tailrec修饰。
  • 尾递归优化是一种编译器优化技术,可以将尾递归调用转换为循环,从而避免栈溢出并提高性能。
/**
 * 尾递归函数,用tailrec进行修饰
 */
tailrec fun tailRecursiveFactorial(n: Int, accumulator: Int = 1):Int{
    if(n <= 1){
        return accumulator
    } else {
        return tailRecursiveFactorial(n-1,n*accumulator)
    }
}
println(tailRecursiveFactorial(3))//6
高阶函数
  • 高阶函数(Higher-Order Function)是指一个函数,它可以接收另一个函数作为参数,或者返回一个函数作为结果。
  • 高阶函数提供了一种非常灵活和强大的方式来处理函数逻辑,使得代码更加模块化和可重用。
接收函数作为参数

高阶函数可以接收一个或多个函数类型的参数。
格式:函数名称:(参数)->函数返回值

/**
 * 函数A作为函数B的参数
 * operation:(Int,Int) -> Int
 * operation是函数A的名称
 * (Int,Int)是函数A的参数
 * -> Int是函数A的返回值类型
 */
fun applyOperation(x:Int,y:Int,operation:(Int,Int) -> Int):Int{
    return operation(x,y)
}
    //{ a, b -> a + b } 表示参数函数A的参数和函数体,用->隔开
    var result = applyOperation(2,3) { a, b -> a + b }
    println(result)//5
    var result1 = applyOperation(2,3) { a, b -> a * b }
    println(result1)//6
返回函数作为结果

高阶函数可以返回一个函数类型的结果。
格式:在高阶函数后面:(参数)->返回值类型

/**
 * 函数A作为函数B的返回值
 * :(Int,Int)->Int
 * (Int,Int)是函数A的参数
 * ->Int 函数A的返回值
 */
fun functionB(a:Int):(Int,Int)->Int{
    return when(a){
        1 -> {b,c -> b+c}
        2 -> {b,c -> b-c}
        3 -> {b,c -> b*c}
        else -> {b,c -> b/c}
    }
}
    //返回函数
    var functionA = functionB(1)
    println(functionA(3,5))//8
    functionA = functionB(2)
    println(functionA(3,5))//-2
标准库中的高阶函数

Kotlin 标准库中有许多高阶函数,比如 let、run、apply、also、filter、map 等。这些函数极大地简化了集合操作和其他常见编程任务。

val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 }
println(doubled) // 输出: [2, 4, 6, 8, 10]
扩展函数

扩展函数(Extension Function)是一种特殊类型的函数,它可以为现有的类添加新的成员函数,而无需使用继承或修改原有类的源代码。这种功能是通过静态成员函数的语法糖来实现的,尽管在底层实现上它们并不是真正的类成员方法。
定义:扩展函数使用receiverType.functionName的语法进行定义,其中receiverType是你要扩展的类名,functionName是你想要添加的函数名。函数体内部可以通过this关键字来引用接收者对象(即receiverType的实例)。

/**
 * 扩展函数,格式:原有类.扩展函数的名称
 * 对系统Array类增加交换扩展函数
 */
fun <T> Array<T>.swap(pos1:Int,pos2:Int){
    val temp = this[pos1]
    this[pos1] = this[pos2]
    this[pos2] = temp
}
    val intArray = arrayOf(1,2,3,4,5)
    //扩展函数调用跟普通函数一样
    intArray.swap(1,2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html,css,js的粒子效果

这段代码实现了一个基于HTML5 Canvas的高级粒子效果&#xff0c;用户可以通过鼠标与粒子进行交互。下面是对代码的详细解析&#xff1a; HTML部分 使用<!DOCTYPE html>声明文档类型。<html>标签内包含了整个网页的内容。<head>部分定义了网页的标题&#x…

学习记录之原型,原型链

构造函数创建对象 Person和普通函数没有区别&#xff0c;之所以是构造函数在于它是通过new关键字调用的&#xff0c;p就是通过构造函数Person创建的实列对象 function Person(age, name) {this.age age;this.name name;}let p new Person(18, 张三);prototype prototype n…

go语言zero框架通过chromedp实现网页在线截图的设计与功能实现

在 GoZero 框架中实现网页在线截图的功能&#xff0c;可以通过集成 chromedp 库来控制 Chrome 浏览器进行截图。chromedp 是一个基于 Chrome DevTools 协议的 Go 包&#xff0c;可以用来在 Go 程序中模拟浏览器操作&#xff0c;如页面截图、DOM 操作、表单提交等。 下面是一个…

以 RFID 为钥,开启民兵装备管理的科技之门

民兵配备的武器及装备涵盖了各式武器、弹药及军事技术设备&#xff0c;其管理的优良直接决定了民兵的作战效能。鉴于民兵装备普遍面临老化、维护支援不充分等问题&#xff0c;迫切需要迅速建立完善的民兵装备管理新体系。这一转变将推动民兵装备由数量扩张转向质量提升&#xf…

电脑办公技巧之如何在 Word 文档中添加文字或图片水印

Microsoft Word是全球最广泛使用的文字处理软件之一&#xff0c;它为用户提供了丰富的编辑功能来美化和保护文档。其中&#xff0c;“水印”是一种特别有用的功能&#xff0c;它可以用于标识文档状态&#xff08;如“草稿”或“机密”&#xff09;、公司标志或是版权信息等。本…

llama-factory实战: 基于qwen2.5-7b 手把手实战 自定义数据集清洗 微调

基于qwen2.5 手把手实战 自定义数据集 微调&#xff08;llama-factory&#xff09; 准备工作1.数据集准备&#xff08;例:民法典.txt&#xff09;2.服务器准备&#xff08;阿里云 DSW 白嫖&#xff09;3.环境配置pip 升级模型下载微调助手 4.数据集处理脚本文件4.1文本分割(ber…

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件&#xff0c;通过设计微透镜&#xff0c;可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制&#xff0c;进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列&#xff08;Microlens Array&#x…

详解单片机学的是什么?(电子硬件)

大家好&#xff0c;我是山羊君Goat。 单片机&#xff0c;对于每一个硬件行业的从业者或者在校电子类专业的学生&#xff0c;相信对于这个名词都不陌生&#xff0c;但是掌没掌握就另说了。 那单片机到底学的是什么呢&#xff1f; 其实单片机在生活中就非常常见&#xff0c;目前…

基于Docker的Spark分布式集群

目录 1. 说明 2. 服务器规划 3. 步骤 3.1 要点 3.2 配置文件 3.2 访问Spark Master 4. 使用测试 5. 参考 1. 说明 以docker容器方式实现apache spark计算集群&#xff0c;能灵活的增减配置与worker数目。 2. 服务器规划 服务器 (1master, 3workers) ip开放端口备注ce…

9. 神经网络(一.神经元模型)

首先&#xff0c;先看一个简化的生物神经元结构&#xff1a; 生物神经元有多种类型&#xff0c;内部也有复杂的结构&#xff0c;但是可以把单个神经元简化为3部分组成&#xff1a; 树突&#xff1a;一个神经元往往有多个树突&#xff0c;用于接收传入的信息。轴突&#xff1a;…

web-view环境下,H5页面打开其他小程序

在Web-view环境下&#xff0c;H5页面无法直接打开其他小程序。正确的实现方式是先从H5页面跳转回当前小程序&#xff0c;再由当前小程序跳转到目标小程序。具体实现方法如下&#xff1a; H5页面跳转回小程序时&#xff0c;调用wx.miniProgram.navigateTo()方法。 小程序跳转到…

数据恢复常用方法(三)如何辨别固态硬盘故障类型

数据恢复首先需要辨别固态硬盘故障类型&#xff0c;只有先确认故障类型&#xff0c;才能进行下一步动作 如下是一种常见的场景&#xff0c;固态硬盘无法识别&#xff0c;接入电源与数据线&#xff0c;电脑的磁盘管理不显示任何信息。 第一步&#xff1a;确认硬件状态&#xff…

Android Studio打包APK

1.导出APK安装包 如果是首次打包&#xff0c;Create new 单击蓝色对话框右边文件夹&#x1f4c2;图标 &#xff0c;选择密钥保存路径&#xff0c;然后在下方File name对话框中填写您想要名称&#xff0c;再点击OK回到密钥创建对话框。 在此对话框中填写密码&#xff08;Passwo…

当使用 npm 时,出现 `certificate has expired` 错误通常意味着请求的证书已过期。

当使用 npm 时&#xff0c;出现 certificate has expired 错误通常意味着请求的证书已过期。这可能是由于以下几种情况&#xff1a; 网络代理问题&#xff1a;如果使用了网络代理&#xff0c;代理服务器的证书可能过期或配置有误。系统时间错误&#xff1a;系统时间不准确可能导…

AWS IAM用户启用MFA认证

1. 进入IAM界面&#xff0c;点击Add user 2. 创建用户 3. 添加用户权限&#xff0c;例如这里赋予power user权限 4. 用手机下载MFA软件&#xff0c;进入App Store搜索mfa即可得到Google Authenticator&#xff0c;点击安装 5. 用户创建后&#xff0c;进入点击用户名进入Securi…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)

为进一步测试通过请求头传递token进行身份验证&#xff0c;在main.htm中增加layui的数据表格组件&#xff0c;并调用后台服务分页显示数据&#xff0c;后台分页查询数据接口如下所示&#xff08;测试时&#xff0c;直接将数据写死到代码中&#xff0c;没有查询数据库&#xff0…

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

【leetcode 24】151.翻转字符串里的单词==❗没看懂❗==

思路&#xff1a; 一些同学会使用split库函数&#xff0c;分隔单词&#xff0c;然后定义一个新的string字符串&#xff0c;最后再把单词倒序相加&#xff0c;那么这道题题目就是一道水题了&#xff0c;失去了它的意义。 所以这里我还是提高一下本题的难度&#xff1a;不要使用辅…

STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态

STM32W5500以太网应用开发003_TCP服务器添加OLED&#xff08;u8g2&#xff09;显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…

Oracle审计

审计是监控选定的用户数据库操作的过程 审计的目的&#xff1a; 调查可疑的数据库活动&#xff1a; 审计可以帮助检测和跟踪潜在的 security breaches、未授权的访问尝试或其他异常行为。通过分析审计日志&#xff0c;可以确定可疑活动的来源、时间、频率和影响。 收集特定数…